Несколько процессов приложения Socket.io вызывают многократное подключение и отключение каждого клиентского сокета - PullRequest
0 голосов
/ 30 января 2019

Я работаю над приложением nodejs с Socket.io, и я провел тест в одном процессе, используя PM 2, и никаких ошибок не было.Затем я перехожу в нашу производственную среду (мы используем Google Cloud Compute Instance).

Я запускаю 3 процесса приложения и клиент iOS подключается к серверу.Кстати, клиент iOS не поддерживает соединение с сокетом.Не отправляет отключение на сервер.Но он отключен и переподключен к серверу.Это происходит постоянно.

Я не уверен, почему сервер отключает клиента.Если у вас есть подсказка или ответ на этот вопрос, я был бы признателен вам.

Ответы [ 3 ]

0 голосов
/ 30 января 2019

По умолчанию клиент socket.io «тестирует» соединение с сервером с помощью пары http-запросов.Если у вас есть несколько запросов к серверу, и эти первоначальные запросы http не обращаются к одному и тому же серверу каждый раз, то соединение socket.io никогда не будет установлено должным образом и не переключится на webSocket, и оно будет пытаться использовать опрос http.

Есть два способа это исправить.

  1. Вы можете настроить своих клиентов так, чтобы они просто предполагали, что протокол webSocket будет работать.Это будет инициировать соединение с одним и только одним http-соединением, которое затем будет немедленно обновлено до протокола webSocket (при этом поверх будет запущен socket.io).В socket.io это опция transport, указанная при начальном подключении.

  2. Вы можете настроить инфраструктуру сервера так, чтобы он зависал, чтобы запрос от данного клиента всегда возвращалсяна тот же сервер.Есть много способов сделать это в зависимости от архитектуры вашего сервера и от того, как выполняется балансировка нагрузки между вашими серверами.

Если ваши серверы поддерживают любое состояние клиента локально по отношению к серверу (ине в общей базе данных, к которой имеют доступ все серверы), тогда вам понадобится даже разорванное соединение и переподключение, чтобы вернуться на тот же сервер, и вам понадобятся липкие соединения как единственное решение.Вы можете прочитать больше о липких сессиях на сайте socket.io здесь .

0 голосов
/ 07 февраля 2019

Спасибо за ваши ответы.

Я наконец понял проблему.Проблема была вызвана TTL серверной службы в Google Cloud Load Balancer.Значение TTL по умолчанию составляло 30 секунд, и каждое подключение к сокету пыталось отключить и повторно подключить.

Итак, я обновил значение до 3600, а затем смог сохранить соединение.

0 голосов
/ 30 января 2019

Вероятно, это связано с тем, что запросы заканчиваются на другом компьютере, а не на том, с которого они были получены.

Прямо с Документация Socket.io: использование нескольких узлов :

Если вы планируете распределить загрузку соединений между различными процессами или машинами, вы должны убедиться, что запросы, связанные с конкретным идентификатором сеанса, подключаются к процессу, который их инициировал.

Что вынужно сделать:

  • Включить сходство сессий , иначе липкие сессии .
  • Если вы хотите работать с комнатами / пространствами имен, вы такженеобходимо использовать централизованное хранилище памяти для отслеживания информации о пространстве имен, например адаптер Redis / Redis .

Но я бы посоветовал вам прочитать часть документации, которую я разместилвсе могло бы измениться с тех пор, как я реализовал что-то подобное в последний раз.

...