BACK
Use casesWebSocket reconnect — backoff после разрыва
Use cases · 45

WebSocket reconnect — backoff после разрыва

Паттерн

Соединение оборвалось — сеть моргнула, телефон ушёл в sleep, backend задеплоился. Надо переподключиться, но с растущей задержкой (backoff), чтобы не задушить сервер тысячами одновременных reconnect.

Какую проблему решаем

Без backoff тысячи клиентов после перебоя сети начнут одновременно reconnect и положат backend. Императивный setTimeout(reconnect, 1000) часто создаёт параллельные socket и забывает остановиться при уходе со страницы.

Операторы и зачем они нужны

  • retry({count, delay}) — повторно подписывается на connection factory после error. Это и есть reconnect.
  • timer(retryIndex * 10) — backoff: каждая следующая попытка ждёт дольше.
  • scan — считает успешные подключения или попытки для telemetry.

Подводные камни

  • retry без delay — tight loop, тысяча попыток в секунду. Положит и backend, и батарею.
  • Auth-ошибки (401) ретраить бесполезно — пока не обновится токен. Условный retry, как для HTTP.
  • Не путайте общий socket lifecycle и подписки компонентов. Destroy одного компонента не должен закрывать socket для всего приложения.

Что в итоге получаем

Временные сбои сети не ломают realtime-фичу. Reconnect ограничен, наблюдаем и не задушит сервер.

script.ts // TypeScript
CONSOLE · Console Output
Нажмите на запуск, чтобы увидеть результат...