Node.js、多线程和 Socket.io

     2023-03-07     80

关键词:

【中文标题】Node.js、多线程和 Socket.io【英文标题】:Node.js, multi-threading and Socket.io 【发布时间】:2012-01-23 16:55:53 【问题描述】:

我希望 Socket.io 在 Node.js v.0.6.0 及更高版本中使用native load balancing(“集群”)进行多线程工作。

据我了解,Socket.io 使用 Redis 来存储其内部数据。我的理解是:我们不想为每个工作人员生成一个新的 Redis 实例,而是要强制工作人员使用与主服务器相同的 Redis 实例。因此,连接数据将在所有工作人员之间共享。

master 里面是这样的:

RedisInstance = new io.RedisStore;

我们必须以某种方式将RedisInstance 传递给工作人员并执行以下操作:

io.set('store', RedisInstance);

受this implementation 使用旧的第 3 方集群模块的启发,我有以下非工作实现:

var cluster = require('cluster');
var http = require('http');
var numCPUs = require('os').cpus().length;

if (cluster.isMaster) 
  // Fork workers.
  for (var i = 0; i < numCPUs; i++) 
    cluster.fork();
  

  var sio = require('socket.io')
  , RedisStore = sio.RedisStore
  , io = sio.listen(8080, options);

  // Somehow pass this information to the workers
  io.set('store', new RedisStore);

 else 
  // Do the work here
  io.sockets.on('connection', function (socket) 
    socket.on('chat', function (data) 
      socket.broadcast.emit('chat', data);
    )
  );

想法?我可能完全走错了方向,任何人都可以指出一些想法吗?

【问题讨论】:

我想知道你最终使用的是什么方法。 【参考方案1】:

其实你的代码应该是这样的:

var cluster = require('cluster');
var http = require('http');
var numCPUs = require('os').cpus().length;

if (cluster.isMaster) 
  // Fork workers.
  for (var i = 0; i < numCPUs; i++) 
    cluster.fork();
  
 else 
  var sio = require('socket.io')
  , RedisStore = sio.RedisStore
  , io = sio.listen(8080, options);

  // Somehow pass this information to the workers
  io.set('store', new RedisStore);

  // Do the work here
  io.sockets.on('connection', function (socket) 
    socket.on('chat', function (data) 
      socket.broadcast.emit('chat', data);
    )
  );

另一种选择是打开 Socket.IO 以侦听多个端口并拥有类似 HAProxy 负载平衡的东西。 无论如何,您知道最重要的事情:使用 RedisStore 在进程之外进行扩展!

资源:

http://nodejs.org/docs/latest/api/cluster.html How can I scale socket.io? How to reuse redis connection in socket.io? Node: Scale socket.io / nowjs - scale across different instances http://delicious.com/alessioaw/socket.io

【讨论】:

该实现不会为每个工作人员创建一个新的 RedisStore 吗?另外,使用像 HAProxy 这样的东西有什么好处?似乎使用 Node 中原生的功能更好。 HAProxy 的优点:您可以在不同的端口上拥有进程,您可以更仔细地监控它们并在它们死亡时重新启动(使用monit,upstart)。同样是的,您需要为每个工作人员创建一个新的 RedisStore。认为集群是 child_process.fork() 之上的实现,所以你基本上复制了应用程序 N 次(据我所知,进程共享相同的文件描述符)。 我刚刚尝试了您的代码示例,似乎无法正常工作。单线程时,1500 个连接运行高达 50% 的 CPU(每个工作人员的工作量都比示例中的多)。使用您的示例,在 每个 进程运行高达 80-90% 的 CPU 之前,我无法获得多达 500 个连接。很明显,有些地方出了问题,因为这使情况变得更糟。 这里有一个带有 child_process.fork() 的示例应用程序:github.com/dshaw/talks/tree/master/2011-10-jsclub/sample-app 你也可以尝试一下并告诉我它是怎么回事吗?基本上把worker js 代码放在app.js 那里,并尝试遵循相同的结构。 啊,谢谢你的链接。理想情况下,这应该只在一个端口上工作(而不是几个,就像这个 repo 所做的那样)。有什么建议?看来我们可以使用 socket-io-announce 在所有工作人员之间共享 Redis 连接详细信息。

使用 node.js、socket.io 和 redis 的一对一聊天应用程序

】使用node.js、socket.io和redis的一对一聊天应用程序【英文标题】:onetoonechatappwithnode.js,socket.ioandredis【发布时间】:2014-10-1810:54:16【问题描述】:我目前在node.js和socket.io中有一个聊天应用程序(一对一)。随着我网站上的用户越... 查看详情

node.js、socket.io 和 SSL

】node.js、socket.io和SSL【英文标题】:node.js,socket.ioandSSL【发布时间】:2013-05-2721:01:09【问题描述】:我有一个运行启用SSL的Apache服务器。现在我做了一个小聊天,它使用node.js和socket.io来传输数据。在非安全连接上使用端口8080工... 查看详情

Node.js 使用 socket.io 进行重构

】Node.js使用socket.io进行重构【英文标题】:Node.jsrestifywithsocket.io【发布时间】:2012-10-1713:51:40【问题描述】:是否可以像express和socket.io一样在同一个端口上运行socket.io和restify?我就是这样做的,但是没有用#server.coffeerestify=requi... 查看详情

node.js + socket.io:拍卖网站开发

】node.js+socket.io:拍卖网站开发【英文标题】:node.js+socket.io:auctionwebsitedevelopment【发布时间】:2016-05-0119:00:48【问题描述】:我目前正在使用node.js和socket.io编写拍卖脚本。但是该网站是使用PHP和MySQL开发的。在这里,我仅将node.j... 查看详情

CORS 被 node.js 和 socket.io 阻止

】CORS被node.js和socket.io阻止【英文标题】:CORSBlockedwithnode.jsandsocket.io【发布时间】:2015-10-0901:20:17【问题描述】:我最近开始学习node.js和socket.io。我遵循了socket.io的一个简单教程,并且在我的计算机上运行时一切正常。但是,... 查看详情

如何将 Asterisk ARI 与 socket.io 和 Node.js 一起使用

】如何将AsteriskARI与socket.io和Node.js一起使用【英文标题】:HowtouseAsteriskARIwithsocket.io&Node.js【发布时间】:2016-01-0207:27:24【问题描述】:最近开始接触星号、Linux、node.js和最近的socket.io,以便我最终可以为星号制作实时Web应用... 查看详情

使用 node.JS 和 Socket.IO 的路径和其他问题

】使用node.JS和Socket.IO的路径和其他问题【英文标题】:path-andotherproblemsusingnode.JSandSocket.IO【发布时间】:2011-03-2705:13:38【问题描述】:我在由Windows托管的TurnkeyLinux上的VirtualBox中使用node.JS。我按照here的说明进行操作。node.JS位于... 查看详情

Node.js + Socket.io |在服务器上设置自定义标头

】Node.js+Socket.io|在服务器上设置自定义标头【英文标题】:Node.js+Socket.io|Setcustomheadersontheserver【发布时间】:2017-09-0121:02:06【问题描述】:我使用Helmet和Express从服务器端设置相当多的安全HTTP标头。这很好,当在node.js应用程序上... 查看详情

facebook 和 socket.io node.js

】facebook和socket.ionode.js【英文标题】:facebookandsocket.ionode.js【发布时间】:2012-06-0401:00:16【问题描述】:我有一个好主意,但我有一些问题......如何将facebook用户连接到节点应用程序-socket.io我创建了一个socket.io聊天,但现在希望... 查看详情

带有 Node.js 和 socket.io 的 WebSockets

】带有Node.js和socket.io的WebSockets【英文标题】:WebSocketswithNode.jsandsocket.io【发布时间】:2011-12-2720:17:54【问题描述】:我已经使用画布和Javascript构建了一个游戏,我想使用WebSockets和Node.js实现多人游戏功能我是Node的新手,我已经... 查看详情

STOMP 上的重复事件 Socket.io 和 Node.js

】STOMP上的重复事件Socket.io和Node.js【英文标题】:DuplicateEventsSocket.ioandNode.jsoverSTOMP【发布时间】:2013-02-0719:20:19【问题描述】:我需要一些关于我的node.js+socket.io实现的帮助。该服务公开了一个服务器,该服务器通过STOMP协议连... 查看详情

Phaser.js 中的 Node.js 和 Socket.io 未连接 socket.io/?EIO=3&transport=polling

】Phaser.js中的Node.js和Socket.io未连接socket.io/?EIO=3&transport=polling【英文标题】:Node.jsandSocket.ioinPhaser.jsnotconnectingsocket.io/?EIO=3&transport=polling【发布时间】:2017-06-1022:16:31【问题描述】:我能够运行我的node.js服务器,我的phaser.j... 查看详情

Node.JS、Socket.IO 和集群中的 WebSocket 握手不起作用

】Node.JS、Socket.IO和集群中的WebSocket握手不起作用【英文标题】:WebSockethandshakeinNode.JS,Socket.IOandClustersnotworking【发布时间】:2014-12-1001:12:55【问题描述】:我在使用Node.js、socket.io和node.js集群对我的应用程序进行集群时遇到问题... 查看详情

node.js 和 socket.io。 websocket的传输类型配置?

】node.js和socket.io。websocket的传输类型配置?【英文标题】:node.jsandsocket.io.transporttypeconfigurationforwebsocket?【发布时间】:2012-12-2907:51:52【问题描述】:这个问题涉及我在两周内测试了nodejs和socket.io。当我开始时,我从客户端中的... 查看详情

使用 Node.js 在 Heroku 上使用 Socket.io 和 Redis

】使用Node.js在Heroku上使用Socket.io和Redis【英文标题】:UsingSocket.ioandRedisonHerokuwithNode.js【发布时间】:2012-06-1908:37:00【问题描述】:我正在尝试使用Node.js和带有Redis的Socket.io将应用程序部署到Heroku。我已经将Socket.io设置为使用XHR... 查看详情

socket.io 和 node.js 400 错误请求

】socket.io和node.js400错误请求【英文标题】:socket.ioandnode.js400BadRequest【发布时间】:2014-11-0709:44:52【问题描述】:我收到了这个错误请求。红色的请求出现错误-400错误请求,它需要超过30秒。错误后套接字工作正常,但需要更多... 查看详情

Node.js + Socket.io 内存泄漏和最大监听器

】Node.js+Socket.io内存泄漏和最大监听器【英文标题】:Node.js+Socket.iomemoryleakandmaxlistener【发布时间】:2013-04-0923:59:01【问题描述】:我是node.js初学者。尝试创建简单的聊天应用程序,但有问题。当页面快速刷新10次以上时,我有... 查看详情

Node.js 和 Socket.io 创建房间

】Node.js和Socket.io创建房间【英文标题】:Node.jsandSocket.ioCreatingRoom【发布时间】:2013-10-1000:00:51【问题描述】:我可以寻求您的帮助吗?我的代码不适用于使用socket.room创建房间,首先我声明了varrooms=[\'Lobby\'];,我想创建房间并... 查看详情