Use cases/WebSocket 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 ограничен, наблюдаем и не задушит сервер.