【问题标题】:Node.js cluster module appears to break Socket.io handshakeNode.js 集群模块似乎打破了 Socket.io 握手
【发布时间】: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


    【解决方案1】:

    socket.io 不是 WebSockets 的简单包装器,它做的更多。打开握手是一个 http 请求,用于决定协议(WebSocket、轮询、闪存套接字等),然后在您的情况下,可能是一个 WebSocket 请求。如果它们命中不同的进程,握手将失败。

    socket.io 要求您使用粘性会话,以确保给定的客户端每次都命中相同的进程。如果你想使用集群,他们建议使用sticky-session module。

    【讨论】:

    • 据此推断,并使用另一个问题中的this answer,如果不使用 Redis/etc,就不可能在两台或多台机器之间进行负载平衡。后端商店?
    • @smitelli 我认为它不再支持 Redis 后端。您只需设置负载均衡器即可执行粘性路由。
    猜你喜欢
    • 2014-12-10
    • 2020-03-18
    • 2019-02-26
    • 1970-01-01
    • 1970-01-01
    • 2022-08-24
    • 1970-01-01
    • 2018-03-07
    • 2015-12-12
    相关资源
    最近更新 更多