2013-01-20 29 views
2

我一直在四处想看看是否有人遇到了这一点,但我有点不期待,这就是我发现了什么。单进程多线程socket.io在Node.js应用程式

我面对现在的问题是关系到我正在创建的应用程序架构的问题; 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监听器多线程化为多个线程,但是我担心的是,因为他们在技术上都回到单线程进程中,所以不会让我多任何可能的性能增加 - 解读他们?我在这里的测试/基准测试部门空洞起来,我不知道这些理论背后的理论足以说明这里最好的基本方法......所以我非常感谢任何反馈/输入任何人有此;)

回答

4

我能够做一些更多的测试,似乎是在一个单独的线程具有socket.io听众仍然是表现非常有利的,即使他们有管道数据输入/输出的单个“区域”(经理)流程。通过这种方式,服务器可以使用单独的CPU来处理IO处理,而不是区域处理。

所以这里的答案是肯定的,它仍然是有利于你的听众/插座多线程成单独的线程,即使所有的线程都与一些单个线程通信。这当然会导致我遇到的另一个问题,那就是如何最佳地优化node.js中多个子进程之间的通信。因为这是此进程中下一个逻辑步骤/障碍,所以我将链接到下面的这个问题,以防万一否则最终会阻碍他们解决这个问题。

Inter-child-process communication options in node.js cluster

+0

你真的在这里天才布赖恩... –