【问题标题】:Scaling websockets/ws with multiple server instances使用多个服务器实例扩展 websockets/ws
【发布时间】:2023-03-13 01:00:02
【问题描述】:

我在单机上使用websockets/ws。它工作正常。我想在多核和多个实例上水平扩展它。 对于多核,我尝试使用pm2,它似乎工作得很好。

第一问:这是最好的方法还是合适的方法?这是我用 pm2 测试的代码

// ws-server.js
const WebSocket = require('ws');

const wss = new WebSocket.Server({ port: 3131 });

var pid = process.pid + ''
console.log('process pid: '+ pid)

wss.on('connection', function connection(ws) {
  ws.on('message', function incoming(message) {
    if (message === 'get-pid') {
      ws.send('pid-' + pid)
    } else {
      var matched = pid === message ? 'old friends' : 'strangers' 
      ws.send([pid, message, 'we are ' + matched].join(', '))
    }
  });
  ws.send('first time')
});

和客户端 websocket 实例

// ws-cient.js
const WebSocket = require('ws');
const ws = new WebSocket('ws://localhost:3131/');

var pid
ws.on('open', function open() {
  ws.send('get-pid');
  setInterval(function() {
    ws.send(pid)
  }, 1000)
});

ws.on('message', function incoming(data) {
  if (/^pid/.test(data)) {
    pid = data.match(/\d+/)[0]
    console.log('got pid: ' + pid) 
  } else {
    console.log(data)
  }
});

只需使用 pm2 运行服务器和客户端

   $ pm2 start ws-server.js -i 50
   $ pm2 start ws-client.js -i 50

如果您现在看到日志pm2 logs ws-client,每个客户端每秒都会访问相同的连接(在服务器上)。 所以对于多核 ws 和 PM2 配合得很好。

第二问:如何扩展多个实例? 我刚刚看到SocketCluster 用于水平缩放,但是它可以与 websockets/ws 一起使用,因为我已经用 ws 开发了代码。水平缩放的其他解决方案可能是什么。

【问题讨论】:

    标签: node.js websocket pm2 node-cluster


    【解决方案1】:

    这个问题的答案有点晚了,但是对于仍然面临这个问题的任何人,我已经写了一篇关于在介质上集群 WebSocket 服务器的文章。

    https://medium.com/@mohsenes/websocket-cluster-with-nestjs-and-redis-a18882d418ed

    【讨论】:

    • 感谢分享写作和分享这篇文章。
    【解决方案2】:

    不幸的是,跨不同进程扩展 Websocket 会很困难,我建议你使用这个库:

    https://github.com/ClusterWS/ClusterWS

    这个库的主要目的是跨进程和机器扩展 WebSocket。 另外,好在图书馆又小又快。

    【讨论】:

    • 此库现已存档/弃用
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-24
    • 2010-10-08
    • 2015-08-29
    • 1970-01-01
    • 1970-01-01
    • 2022-11-22
    • 2018-05-08
    相关资源
    最近更新 更多