【发布时间】:2015-02-26 16:57:11
【问题描述】:
我有以下围绕 Socket.io 库构建的简单 WebSocket 服务器:
var PROCESSES = 1,
cluster = require('cluster'),
i;
if (cluster.isMaster) {
for (i = 0; i < PROCESSES; i++) {
console.log('Forking worker', i);
cluster.fork();
}
} else {
(function () {
var server = require('http').Server(),
io = require('socket.io')(server);
io.on('connection', function (socket) {
socket.on('message', function (message) {
socket.emit('message', message + ' too!');
});
});
server.listen(8080);
})();
}
启动时,它会创建一个服务器进程,用于侦听 WebSocket 连接并将消息的变体回显给客户端:
$ iocat --socketio ws://localhost:8080
> i am hungry
i am hungry too!
> i like you
i like you too!
>
现在,当我将 PROCESSES 变量更改为大于 1 的数字时,客户端无法再连接。
var PROCESSES = 2,
...
...导致...
$ iocat --socketio ws://localhost:8080
> client.on error
$ iocat -v --socketio ws://localhost:8080
> SIOClient> SIOClient: url-> ws://localhost:8080
SIOClient> onError { [Error: xhr poll error] description: 400 }
client.on error
我的直觉是,集群模块在给定多个工作进程时,会在握手过程中不恰当地从一个进程切换到另一个进程。但我会认为整个连接,从客户端启动握手到最后关闭套接字,都发生在一个持久的、保持活动状态的连接上。
那么这里到底发生了什么?它怎么能解决?我熟悉使用 Redis 存储在不同机器上的服务器进程之间共享状态的想法,但是对于我的用例来说,这感觉像是太多的基础设施(从客户端收集事件流并回复确认)。
版本: socket.io@1.3.3,node@0.10.36,在 OS X 10.10 和 CentOS 6.6 上看到
【问题讨论】:
标签: node.js websocket socket.io fork