【问题标题】:Socket.io pm2 reload duplicates socketsSocket.io pm2 重新加载重复的套接字
【发布时间】:2016-11-11 13:28:27
【问题描述】:

我现在使用 socket.io 和 pm2 在集群模式下运行 node.js(默认 socket.io 聊天“hello world”示例)

var
    probe = require('pmx').probe(),
    app = require('express')(),
    server = require('http').createServer(app),
    io = require('socket.io')(server),

    port = 3131 + parseInt(process.env.NODE_APP_INSTANCE),
    counter = probe.counter({
        name: 'User online'
    });



io.on('connection', function(socket) {
    counter.inc();
    socket.on('disconnect', function() {
        counter.dec();
    });

    socket.on('message', function() {
        socket.emit('message', port);
    });
});

server.listen(port, function() {});

和默认的 html 客户端(所有访问我的页面的人都会执行此操作)

var socket;
window.addEventListener("load", function() {
    socket = io.connect('http://localhost:3000/', {
        'reconnection': true,
        'reconnectionDelay': 500,
        'reconnectionAttempts': 3
    });

    socket.on('message', function(message) {
        console.log(message);
    });

    setInterval(function() {
        socket.emit('message', {});
    }, 2000);
});

这与默认的 nginx 粘性会话配置一起使用(http://socket.io/docs/using-multiple-nodes/ 在这里找到,一个区别,我跳过了最后一个 redis 部分,只使用了 nginx 配置)

upstream io_nodes {
    ip_hash;
    server 127.0 .0 .1: 3131;
    server 127.0 .0 .1: 3132;
    server 127.0 .0 .1: 3133;
    server 127.0 .0 .1: 3134;
    server 127.0 .0 .1: 3135;
    server 127.0 .0 .1: 3136;
    server 127.0 .0 .1: 3137;
    server 127.0 .0 .1: 3138;
}

和这样的 pm2 配置:

{
    "apps": [{
        "name": "server",
        "script": "server.js",
        "instances": 8,
        "exec_mode": "cluster",
        "max_memory_restart": "2G"
    }]
}

我有几个问题:

  1. 首先是当我的整个项目在线用户计数时,用户在线计数更高,例如(真实案例!)如果我有 3800 个在线用户,我的关键指标(或简单的 io.eio.clientsCount)显示 4000 甚至总共有 5000 个客户端连接。

  2. 1234563有时所有节点,不仅首先乘以套接字计数。为避免这种情况,我需要杀死 pm2,稍等片刻,然后重新启动。

pm2重载后的情况(实际只有3868人在线):

【问题讨论】:

  • 对于您的第一个问题,socket.io 多次向服务器发出请求。因此,Keymetrics 可能会显示比预期更多的计数。我建议与他们分享这个问题。我也想知道你的第二个问题的解决方案。

标签: node.js nginx socket.io pm2


【解决方案1】:

如果您不介意只使用一个进程来处理 ws, 你可以这样做:

let clusterId = process.env.NODE_APP_INSTANCE
if (clusterId > 0) return app
//otherwise, do atttch the ws server

【讨论】:

  • 谢谢,已经通过 JWT 的身份验证解决了,现在一切都很好:)
  • @MyMomSaysIamSpecial 如果您已经解决了您的问题,回答您自己的问题并将其标记为正确答案将使所有人受益
猜你喜欢
  • 2012-12-27
  • 1970-01-01
  • 2013-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-26
  • 2013-02-28
相关资源
最近更新 更多