我一直在四处寻找,看看是否有其他人遇到过这个问题,但我有点预料到不会,这就是我发现的。
我现在面临的问题与我正在构建的应用程序的架构有关;node.js 中的游戏服务器。截至目前,服务器以单个“管理器”进程启动,该进程控制所有子进程。游戏的每个“区域”或“区域”都cluster.fork()
使用单独的进程进行旋转,以便每个“区域”可以在服务器上拥有自己的线程,以优化服务器一次运行许多这些“区域”的能力.
我现在面临的困境是这样的。由于每个“区域”都在单个线程中运行,并且该线程已经每秒运行复杂的 3D 数学 X 次以保持“区域”同步,我不想打开 Socket.io(通信用于与游戏客户端交谈的库)在同一个线程中。我想我挂断的地方是在cluster.on('message')
主进程中使用处理程序的性能以及使用process.send({...})
.
我想看看是否有其他人有这方面的经验,或者从根本上知道整个集群模块是如何工作的,本质上是这样的:
调用是否更快:
var io = require('socket.io').listen( 1337 );
io.sockets.on('connection',...); //map all the functionality here in the "zone" thread
或者做更多这样的事情:
var cluster = require('cluster');
var io = [];
//arbitrary number for the thread count, not important for theory testing
for( var i = 0; i < 4; ++i) {
var process = cluster.fork({...});
process.on('message',myRelayFunction);
io.push( process );
}
当然,假设cluster.fork()
调用是通过管道传输到一个脚本中,该脚本除了打开一个 socket.io 连接并将来自各个客户端的消息中继到“区域”进程之外什么都不做。
我已经尝试对此进行性能测试,但我发现很难判断这是否更快,因为我很难通过连接使机器饱和以获取要测试的输出。
我想确保这是可扩展的,以便在较重的负载下,应用程序可以充分利用服务器上的多个 CPU 内核。所以这当然是说我应该将 socket.io 侦听器多线程化到多个线程中,但我担心的是,由于它们在技术上都通过管道返回到单线程进程中,这不会让我付出任何可能的多线程性能提升-穿线他们?我在这里的测试/基准测试部门有点空虚,我不知道这一切背后的理论如何运作得足够好,无法说出这里最好的基本方法是什么......所以我非常感谢任何反馈/输入任何人对此的看法;)