Как управлять устаревшими подключениями к websocket

#python #websocket #python-asyncio #ping #debounce

#python #websocket #python-asyncio #ping #отключение

Вопрос:

Использование Python Websockets [1] для управления набором подключений к websocket на стороне сервера из браузера. Они должны быть зарегистрированы и поддерживаться.

Проблема: когда пользователь отключается, устаревшее соединение остается в реестре. Кроме того, если пользователь обновляет браузер (1, 2, 17 или n раз) или присутствует сценарий повторного подключения, регистрируется больше недействительных подключений. Это создает реестр, полный устаревших подключений.

Документы решают эту проблему следующим образом:

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

Как правильно идентифицировать и удалять устаревшие соединения? Требуется ли какая-то схема для пинг-понга?

Я нашел код в [2], но он восходит к 2018 году. Это устарело или с тех пор эта проблема была решена?

Ссылка:

  1. https://websockets.readthedocs.io/en/stable/intro.html
  2. https://github.com/aaugustin/websockets/issues/414

Ответ №1:

В принципе, да, схема ping / pong используется для обеспечения соединения. TCP использует нечто подобное с keep-alive . Отправляйте ping каждые X секунд, и если клиент пропускает N раз, то можно с уверенностью предположить, что клиентское соединение отключено и может быть удалено. Предоставленная вами ссылка # 2, по сути, является сутью того, как вы могли бы реализовать сохранение. Вот пример использования autobahn , который имеет множество функций качества жизни, которые я не видел в других фреймворках.

Я мог ошибаться, но я думал, что websockets отправляют какой-то сигнал «disconnect» при обновлении браузера, поэтому вы должны иметь возможность отключать соединения таким образом. Я не работал с websockets несколько лет, но я рекомендую сделать ваш пользовательский интерфейс одностраничным приложением и «отговорить» пользователей от обновления. Хотя и не всегда.