在Express Server重新启动时管理WebSocket连接

时间:2018-12-06 05:43:38

标签: node.js mongodb express websocket

问题的标题可能无法解释问题。

问题是当前我们有一台快递服务器正在监听端口9095(例如)。在该服务器内部,我们实现了一个WebSocket服务器,其路径为9095/wss。现在,我们有大约100000个客户端连接到该WebSocket服务器。因此,每当我们重新启动Express Server时,WebSocket就会断开连接并尝试重新连接(它写在客户端(移动应用程序)上)。每当服务器重新启动客户端的所有连接请求时,在每个连接上我们都会有4-5个mongo调用。因此,在这种情况下,对mongo的大量并行请求的响应使我们的数据库阻塞了。

我要实现的目标是,我正在考虑将WebSocket服务器移至一个全新的进程,直到需要时才启动该服务器,并将使用IPC或其他任何方式执行所有操作。但是问题是我无法在现有客户端中更改WebSocket的路径。我可以在另一台服务器上维护相同的地址,即localhost:9095/wss吗?请记住,服务器已经在端口9095上运行。

或者什么是替代解决方案,以使我不必更改路径和WebSocket服务器。

什么是最好的方法?

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

  

您可以在此处使用redis来保存与用户ID有关的Websocket ID

     

类似于{"userId1":"socketid1","userId2":"socketId2"},因此当您应用时   将重新启动获取ID并执行所需的操作

    var ws    = require('ws'),
    nconf = require('nconf'),
    redis = require('redis');

nconf.argv()
     .env();

var server = new ws.Server({port: nconf.get('PORT')});

var sockets = {};

server.on('connection', function(socket) {
    socket.on('message', function(message) {            
        sockets["userId"] = socket;
    });
});

var db = redis.createClient(nconf.get("REDIS_PORT"), nconf.get("REDIS_HOST"));
if (nconf.get('REDIS_PASSWORD')) {
    db.auth(nconf.get("REDIS_PASSWORD"));
}

db.on('message', function(channel, message) {
    if (channel == 'chanel')
    {
        var a = message.split('>');
        var socket = sockets[a[0]];
        var m = a[1];
        // les messages sont supposés contenir les ID utilisateurs
        //var socket = sockets[message];
        if (socket != undefined)
        {
            socket.send(m);
        }
    }
});

db.subscribe('channel');
console.log('listening at ws://localhost:' + nconf.get('PORT'));