Socket.io Clusterhub不能正常工作

这是使用https://github.com/fent/socket.io-clusterhub为每个群集进程执行的:

var store = new (require('socket.io-clusterhub')); var io = require('socket.io').listen(config.ports.socket); io.configure(function(){ io.set('store',store); }); console.log('Socket service listening on port '+config.ports.socket); io.sockets.on('connection',function(socket){ if(typeof fn === 'function'){fn(socket);} }); 

但它看起来像所有4线程正试图注册不同的套接字ID的同一个用户:

 debug: client authorized info: handshake authorized XEGx6zAP7rSWGQcaxmUB debug: client authorized info: handshake authorized r0Vcr7Z-r_9MnylyxmUC debug: client authorized info: handshake authorized 7RWUgoCuZPIu0IyQxmUj debug: client authorized info: handshake authorized mq0zKCgeDkisr-rbxmUk 

然后彻底断开连接:

 debug: setting request GET /socket.io/1/websocket/XEGx6zAP7rSWGQcaxmUB debug: set heartbeat interval for client XEGx6zAP7rSWGQcaxmUB debug: websocket writing 7:::1+0 warn: client not handshaken client should reconnect info: transport end (error) debug: set close timeout for client XEGx6zAP7rSWGQcaxmUB debug: cleared close timeout for client XEGx6zAP7rSWGQcaxmUB debug: cleared heartbeat interval for client XEGx6zAP7rSWGQcaxmUB debug: discarding transport debug: setting request GET /socket.io/1/websocket/r0Vcr7Z-r_9MnylyxmUC debug: set heartbeat interval for client r0Vcr7Z-r_9MnylyxmUC debug: setting request GET /socket.io/1/websocket/7RWUgoCuZPIu0IyQxmUj debug: set heartbeat interval for client 7RWUgoCuZPIu0IyQxmUj debug: websocket writing 7:::1+0 warn: client not handshaken client should reconnect info: transport end (error) debug: set close timeout for client 7RWUgoCuZPIu0IyQxmUj debug: cleared close timeout for client 7RWUgoCuZPIu0IyQxmUj debug: cleared heartbeat interval for client 7RWUgoCuZPIu0IyQxmUj debug: discarding transport 

即使它继续像r0Vcr7Z-r_9MnylyxmUC仍然活动一样,它根本无法运行callback例程:

 debug: cleared heartbeat timeout for client r0Vcr7Z-r_9MnylyxmUC debug: set heartbeat interval for client r0Vcr7Z-r_9MnylyxmUC debug: emitting heartbeat for client r0Vcr7Z-r_9MnylyxmUC debug: websocket writing 2:: debug: set heartbeat timeout for client r0Vcr7Z-r_9MnylyxmUC debug: got heartbeat packet debug: cleared heartbeat timeout for client r0Vcr7Z-r_9MnylyxmUC debug: set heartbeat interval for client r0Vcr7Z-r_9MnylyxmUC debug: emitting heartbeat for client r0Vcr7Z-r_9MnylyxmUC debug: websocket writing 2:: debug: set heartbeat timeout for client r0Vcr7Z-r_9MnylyxmUC debug: got heartbeat packet debug: cleared heartbeat timeout for client r0Vcr7Z-r_9MnylyxmUC debug: set heartbeat interval for client r0Vcr7Z-r_9MnylyxmUC debug: emitting heartbeat for client r0Vcr7Z-r_9MnylyxmUC debug: websocket writing 2:: debug: set heartbeat timeout for client r0Vcr7Z-r_9MnylyxmUC debug: got heartbeat packet debug: cleared heartbeat timeout for client r0Vcr7Z-r_9MnylyxmUC debug: set heartbeat interval for client r0Vcr7Z-r_9MnylyxmUC debug: emitting heartbeat for client r0Vcr7Z-r_9MnylyxmUC 

有任何想法吗? 谢谢!

由于socket.io通常使用长轮询与服务器通信,所以每个新的请求都可以由群集中的任何节点处理。 因此每个节点都需要有客户端的服务器状态才能够响应请求。 主要的问题是,在初始握手期间,socket.io在创build一个有效的会话之前需要做很less的请求,并且可以在整个集群中分布,这增加了代码的复杂性。 使用跨进程消息传送的Clusterhub方法同步所有内容对我来说看起来效率不高。 我build议看看粘性会话的方法,每个客户端都保证总是与同一个节点一起工作。 你可以在你的nodejs服务器前面configurationload-balancer,或者像https://github.com/indutny/sticky-session