1

我试图弄清楚 websockets 如何在 Nodejs/PM2 集群中工作。

我刚刚通过使用 PM2 启动 4 个子进程进行了一个实验,然后从客户端我向所有 4 个套接字服务器(每个子进程中运行 1 个 ws 服务器)发送了多个 webocket 消息。我没想到的一件事是 Node 能够确定套接字属于哪个进程,因此客户端发送的每条消息都由正确的子进程进行控制台记录。

那么这种行为是由 Nodejs 在内部由集群模块管理的吗?这似乎也是自 Node 12 以来的一个新功能?我可能错了...

代码参考(ws模块使用tsl):https ://github.com/websockets/ws/blob/master/lib/websocket.js#L663

PS:在写答案之前,请检查我写给其他人的评论...

4

2 回答 2

0

你可以试试这个:

    webSocket=function(server) {

    var io = require('socket.io')(server,{ transports: ['websocket', 'polling'] });
    var redis = require('socket.io-redis');
    var pub = require('redis').createClient(6379,'localhost');
    var sub = require('redis').createClient(6379,'localhost');
    io.adapter(redis({pubClient: pub, subClient: sub}));

    io.sockets.on('connection', function (socket) {
        console.log('Connection Establish!!!!!');
    )}
};


app.JS
https.createServer(options, app).listen(httpsAddress, function () {
    console.log("Express server listening on port " + config.get('PORT'));
    webSocket(this)
})
于 2019-09-17T10:00:38.050 回答
0

所以,基本上你需要一个集中的消息代理。N 个进程将有 N 个非共享内存/配置/存储。最受欢迎的选择是redis. Socket.io 使用redis-adapter.

所以,1)安装redis 2)从这里安装redis适配器

之后,您可以关注@pritamjana 的代码。

从适配器文档:

通过使用 socket.io-redis 适配器运行 socket.io,您可以在不同的进程或服务器中运行多个 socket.io 实例,这些实例都可以相互广播和发送事件。

const io = require('socket.io')(3000);
const redisAdapter = require('socket.io-redis');
io.adapter(redisAdapter({ host: 'localhost', port: 6379 }));

// So any of the following commands:

io.emit('hello', 'to all clients');
io.to('room42').emit('hello', "to all clients in 'room42' room");

io.on('connection', (socket) => {
  socket.broadcast.emit('hello', 'to all clients except sender');
  socket.to('room42').emit('hello', "to all clients in 'room42' room except sender");
});
于 2019-09-19T08:15:35.767 回答