【问题标题】:Multi-threaded socket.io in single process in node.js applicationnode.js应用程序中单进程中的多线程socket.io
【发布时间】:2013-01-20 01:59:19
【问题描述】:

我一直在四处寻找是否有其他人遇到过这个问题,但我有点料到不会,这就是我发现的。

我现在面临的问题与我正在构建的应用程序的架构有关; 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 侦听器多线程化到多个线程中,但我担心的是,由于它们在技术上都是通过管道返回到单个线程进程中,所以这不会花费我任何可能的 multi 性能提升-穿线他们?我在这里的测试/基准测试部门有点空虚,我不知道这一切背后的理论如何运作得足够好,无法说出这里最好的基本方法是什么......所以我非常感谢任何反馈/输入任何人对此的看法;)

【问题讨论】:

    标签: multithreading node.js socket.io


    【解决方案1】:

    我能够进行更多测试,似乎在单独的线程中拥有 socket.io 侦听器仍然对性能非常有益,即使他们必须将数据输入/输出单个“区域”(管理器)过程。这样,服务器可以使用单独的 CPU 来处理 IO 处理而不是区域处理。

    所以这里的答案是,是的,将您的侦听器/套接字多线程化到单独的线程中仍然是有益的,即使所有这些线程都在与单个线程进行通信。这当然会导致我遇到的另一个问题,即如何最好地优化 node.js 中多个子进程之间的通信因为这是此过程中的下一个逻辑步骤/障碍,我将链接到下面的问题以防万一else 稍后会在这个问题上磕磕绊绊。

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

    【讨论】:

      猜你喜欢
      • 2012-01-23
      • 1970-01-01
      • 1970-01-01
      • 2015-05-20
      • 1970-01-01
      • 1970-01-01
      • 2017-11-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多