Управление подключением WebSocket при перезапуске экспресс-сервера - PullRequest
0 голосов
/ 06 декабря 2018

Возможно, название вопроса не объясняет проблему.

Проблема в том, что в настоящее время у нас есть один экспресс-сервер, прослушивающий порт 9095 (например).Внутри этого сервера мы внедрили сервер WebSocket, путь которого 9095/wss.Теперь к этому серверу WebSocket подключено около 100000 клиентов.Таким образом, всякий раз, когда мы перезапускаем экспресс-сервер, WebSocket отключается и пытается восстановить соединение (написано на стороне клиента (мобильное приложение)).Всякий раз, когда сервер перезапускает все запросы клиента на соединение, и на каждое соединение у нас есть 4-5 монго-вызовов.Таким образом, в этом случае ответ большого количества параллельных запросов на mongo душит нашу базу данных.

Я пытаюсь добиться того, чтобы я перевел свой сервер WebSocket на совершенно новый процесс и не буду его запускатьсервер пока не понадобится и будет выполнять все операции с использованием IPC или чего-либо еще.Но проблема в том, что я не могу изменить путь WebSocket в существующих клиентах.Возможно ли как-то сохранить тот же адрес, т.е. localhost:9095/wss на другом сервере?Помните, что сервер уже работает на порту 9095.

Или что может быть альтернативным решением для этого, чтобы мне не пришлось менять путь и для моего сервера WebSocket.

Какой должен быть лучший подход для этого?

Любая помощь будет высоко ценится.

1 Ответ

0 голосов
/ 10 декабря 2018

Вы можете использовать redis здесь, чтобы сохранить идентификатор websocket относительно идентификатора пользователя

как {"userId1":"socketid1","userId2":"socketId2"}, поэтому, когда ваше приложение будет перезагружаться, верните идентификаторы и выполните необходимые действия.действие

    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'));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...