Socket.io отключает клиентов в режиме ожидания

У меня есть производственное приложение, которое использует socket.io(node.js back-end) для распространения сообщений всем зарегистрированным клиентам. Многие из моих пользователей испытывают разъединения с сервером socket.io. Обычным вариантом использования для клиента является сохранение веб-приложения в течение всего рабочего дня. Большую часть времени в приложении в рабочий день простаивает, но приложение все еще открыто - до тех пор, пока соединение socket.io не будет потеряно, а затем приложение вышвырнет их.

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

Ответ 1

Похоже, что все, что мы можем здесь сделать, - дать вам несколько советов по отладке, чтобы вы могли узнать больше о том, что вызывает проблему. Итак, вот список вещей, которые нужно изучить.

  • Убедитесь, что socket.io настроен для автоматического повторного подключения. В последних версиях socket.io автоматически включайте параметры по умолчанию, но вам может потребоваться убедиться, что никакая часть кода не отключает его.

  • Убедитесь, что клиент не собирается спать, так что все сетевые подключения становятся неактивными. Отключите связь.

  • В рабочем клиенте (перед его отключением) используйте вкладку "Отладчик Chrome", вкладку "Сеть", вкладку "Веб-сокеты", чтобы убедиться, что вы можете видеть регулярные сообщения ping между клиентом и сервером. Вам нужно будет открыть окно отладки, перейти на вкладку "Сеть", а затем обновить веб-страницу с открытием этого окна отладки, чтобы начать видеть сетевую активность. Вы должны увидеть интересный URL-адрес, в котором есть ?EIO=3&transport=websocket&sid=xxxxxxxxxxxx. Нажмите на это. Затем щелкните субтег "Фреймы". В этот момент вы можете наблюдать за отправкой отдельных пакетов websocket. Вы должны видеть крошечные пакеты длиной 1 каждый раз в то время (это пакеты ping and pong keep-alive). Там примерный снимок экрана, который показывает, что вы ищете. Если вы не видите эти пакеты keep-alive, то вам нужно решить, почему их там нет (возможно, какая-либо проблема с конфигурацией или выпуском socket.io).

  • Поскольку вы упомянули, что можете воспроизвести ситуацию, вам нужно знать, как закрывается сокет (инициируется клиентский конец или инициируется сервер). Один из способов собрать информацию об этом - установить сетевой анализатор на вашем клиенте, чтобы вы могли буквально следить за каждым пакетом, который проходит по сети, от вашего клиента. Существует много разных анализаторов, и многие из них свободны. Я лично использовал Fiddler, но я регулярно слышу, как люди говорят о WireShark. То, что вы хотите увидеть, - это именно то, что происходит в сети, когда клиент теряет свое соединение. Клиент решает отправить закрытый пакет сокетов? Получает ли клиент пакет закрытого сокета от кого-то? Что происходит в сети в момент потери соединения.


Просмотр сети в сети в отладчике Chrome

webSocket network view in Chrome Debugger

Ответ 2

Наиболее вероятной причиной является один конец закрытия WebSocket из-за бездействия. Обычно это делается с помощью балансировщика нагрузки, но могут быть и другие виновники. Исправить это - просто послать сообщение так часто (я использую 30 секунд, но в зависимости от проблемы, с которой вы можете пойти выше) каждому клиенту. Это предотвратит его появление неактивным и, таким образом, закрытие.