我一直在四处寻找是否有其他人遇到过此事,但我有点不期待,这就是我找到的。
我现在面临的问题与我正在构建的应用程序的架构有关; node.js中的游戏服务器截至目前,服务器启动时只有一个“管理器”进程,可以控制所有子进程。使用cluster.fork()
使用单独的进程旋转游戏的每个“区域”或“区域”,以便每个“区域”可以在服务器上拥有自己的线程,以优化服务器运行其中许多的能力“区域”一下子。
我现在面临的困境就是这个。由于每个“区域”都在一个线程中运行,并且该线程已经开始每秒运行复杂的3D数学X次以保持“区域”同步,我不想打开Socket.io(通信在同一个线程中用于与游戏客户端交谈的库。我想我挂起的地方是在主进程中使用cluster.on('message')
处理程序并使用process.send({...})
将来自Socket.io的消息传递到主进程中。
我正在试图看看是否有其他人有这方面的经验,或者从根本上了解整个群集模块是如何工作的,基本上是这样的:
通话更快:
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监听器多线程转换成多个线程,但我担心的是,因为它们在技术上都是回流到一个线程进程,所以不会让我失去任何可能的性能提升他们?我在这里的测试/基准测试部门是空洞的,我不知道所有这些如何运作良好的理论背后说什么是最好的基本方法...所以我非常感谢任何反馈/输入任何人都有这个;)
答案 0 :(得分:4)
我能够进行更多测试,看起来在一个单独的线程中使用socket.io监听器仍然非常有利于性能,即使他们必须将数据传入/传出单个“区域”(管理器)处理。这样,服务器可以使用单独的CPU来处理IO处理而不是区域处理。
所以这里的答案是肯定的,将侦听器/套接字多头线程化为单独的线程仍然是有益的,即使所有这些线程都与单个线程进行通信。这当然导致了我遇到的另一个问题,即如何最好地优化node.js中多个子进程之间的通信。由于这是此过程中的下一个逻辑步骤/障碍,我将链接到下面的问题,以防任何人否则最终会在这个问题上磕磕绊绊。
Inter-child-process communication options in node.js cluster