关键词:
【中文标题】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\'];,我想创建房间并... 查看详情