Проблема переподключения Socket.io через балансировщик нагрузки GCP - PullRequest
0 голосов
/ 02 апреля 2019

Что-то странное происходит, когда я использую библиотеку socket.io через балансировщик нагрузки GCP.

У меня есть только один узел за балансировщиком нагрузки.

Балансировщик нагрузки разрывает соединение через сокет через 30 секунд после того, как пользователь был подключен к любому из разъемов. По умолчанию GCP устанавливает HTTP тайм-аут на 30 секунд для любых запросов. Это происходит из-за тайм-аутов GCP LB. Мы можем увеличить его, чтобы избежать проблем с сокетами Google скажет. , но этот способ выглядит не очень хорошо для меня, поскольку у клиента может быть локальный брандмауэр с его собственными настройками HTTP времени ожидания.

Как только первое отключение произойдет через 30 секунд, socket.io на стороне клиента немедленно переподключится к сокету, и это выглядит так, как будто все должно быть в порядке, как только я потерял соединение из-за прерывания Google, библиотека восстановила его без каких-либо ошибок, НО Основная проблема в том, что после этого переподключения я больше не могу получать сообщения через сокет. Событие Connect на стороне Node.JS инициировалось только один раз после первого подключения, тогда я не вижу никаких журналов, связанных с новым подключением из-за переподключения на стороне клиента. Зачем ? Почему я не вижу никаких ошибок на стороне пользовательского интерфейса, и я вижу успешное соединение, в то время как на бэкэнде это больше не существует, и остановка сокета работает?

Я использую комнату, и вот как выглядят соединения на стороне клиента:

var socket = io.connect('https://load.balancer.host');
socket.emit('join', { conversationId: 'conversation1' });
socket.on("new_msg", function (data) {
      alert(JSON.stringify(data));
});

Вот как мой бэкэнд обрабатывает это соединение:

io.sockets.on("connection", (socket) => {
    socket.on("join", (data) => {
        socket.join(data.conversationId); // We are using room of socket io

        socket.on("disconnect", (data) => {
            socket.leave(data.conversationId);
            console.log("Got disconnect!");
        });
    });
});

Спасибо за любой совет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...