NodeJS 使用多个服务器示例扩展Websockets/ws

chhkpiq4  于 2023-06-29  发布在  Node.js
关注(0)|答案(3)|浏览(201)

我在单机上使用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开发了代码。水平扩展的其他解决方案是什么?

0sgqnhkj

0sgqnhkj1#

现在回答这个问题有点晚了,但对于仍然面临这个问题的人来说,我写了一篇关于在medium上集群WebSocket服务器的文章。
https://medium.com/@mohsenes/websocket-cluster-with-nestjs-and-redis-a18882d418ed

nhhxz33t

nhhxz33t2#

不幸的是,很难在不同的进程中扩展WebSocket,我建议你使用这个库:
https://github.com/ClusterWS/ClusterWS
这个库的主要目的是跨进程和机器扩展WebSocket。好的一面是,图书馆很小,也很小。

yquaqz18

yquaqz183#

Redis pub/sub可以使用。来自一个示例的消息将被推送到redis,所有其他示例将成为订阅者。通过这种方式,WebSocket可以在不使用任何第三方软件包的情况下进行扩展

相关问题