我使用Node.js v0.6.0及更高版本(使用RedisStore)提供的本地集群功能运行Socket.io多线程。带集群的Socket.io:遍历所有打开的连接
对于状态的每个新变化,服务器遍历每个连接并在适当的情况下发送消息。 注意:这不是“广播”到所有连接,它将服务器数据与客户端在连接上发送的数据进行比较,以决定是否将服务器数据发送到该特定客户端。考虑下面的代码示例:
io.sockets.clients().forEach(function (socket) {
socket.get('subscription', function (err, message) {
if(message.someProperty === someServerData) {
socket.emit('position', someServerData);
}
});
这时候,只有一个进程,但是现在,客户端收到的每个节点的过程(消息精细的工作,即如果有8个节点进程在运行,所有的客户端接收消息8次)。
我明白为什么会出现问题,但我不确定是否有修复。我怎样才能从一个进程到客户端分配一对一的关系。也许使用Cluster的NODE_WORKER_ID
的东西?
This previous这个问题似乎有点相关,虽然我不确定这有帮助。
这似乎是一个相当普遍的要求。当然,我一定错过了什么?
究竟是什么你想在这里做什么?以某种方式验证用户或..什么? – alessioalex 2011-12-20 15:37:24
@alessioalex服务器正在阅读长长的航班位置,并向订购该航班的客户发送位置更新(例如,客户订购AWE150,并且将接收所有与AWE150相关的新职位)。因此,对于每个新位置,Node服务器遍历所有打开的连接并将该位置转发给适当的连接。也许我的做法是错误的? – 2011-12-20 15:56:06
@David Chouinard你为什么不使用房间?客户端x加入房间'AWE150',当你为此数据做'io.sockets.to('AWE150')。emit('position',somedata)' – 3rdEden 2011-12-20 16:28:19