Все статьи

Halloween Special: Зомби-сессии. История, которую мы не хотим повторить

«Они не появляются в логах. У них нет токена. Но они все еще шлют сообщения…»

Глава 1. Началось все с необъяснимой активности

Это случилось два года назад. Поздней ночью один из наших инженеров заметил странное поведение системы — на продакшн-сервере NextBox продолжали поступать сообщения от пользователей, чьи сессии считались завершёнными уже больше недели. Сессии считались закрытыми, а токены протухшими. Но соединения по WebSocket оставались живыми и продолжали обмениваться данными, как если бы пользователь по-прежнему работал в приложении..

“Сначала мы подумали, что это баг в логах,” — вспоминает разработчик.
“А потом поняли — это не баг. Это они.”

Глава 2. Мертвые души

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

  • при потере токена клиент переставал быть авторизованным,
  • но WebSocket-канал не получал событие об этом,
  • и продолжал жить в фоне, сохраняя контекст, кэш и даже идентификатор.

Снаружи все выглядело спокойно. Внутри были десятки «живых мертвецов» в списке активных соединений.

Глава 3. Когда сеть оживает сама

Сначала это не вызывало проблем. Но через пару дней в логах появилась аномалия: старые соединения, которые давно должны были завершиться, всё ещё оставались активными. Эти зомби-сессии продолжали жить своей жизнью — создавали дубли событий, мешали синхронизации и засоряли логи.

“Это было как цифровой Хэллоуин —
старые сессии возвращались из прошлого и ломали настоящее.”

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

Глава 4. Как мы их уничтожили

Чтобы остановить этот кошмар, мы переписали логику управления жизненным циклом соединений. Теперь каждый WebSocket в NextBox:

  • получает собственный маркер активности,
  • автоматически проверяет актуальность токена,
  • завершает соединение при отсутствии heartbeat-событий,
  • и не может существовать без подтверждения с сервера.

Глава 5. Урок, который мы запомнили

Эта история стала нашим внутренним мемом. Теперь, когда кто-то говорит «почему оно не умерло?», все знают, о чем речь.

Монстры не всегда приходят из фильмов — иногда они живут в стеке WebSocket и не знают, что их уже удалили.

Послесловие от команды NextBox

Мы верим, что надежные системы строятся не только на коде, но и на наблюдательности.Зомби-сессии научили нас уважать мелочи, таймауты, обработку ошибок. И если когда-нибудь вы увидите в логах активность от сессии, которой давно не должно существовать, то просто выключите свет, сделайте кофе… и проверьте WebSocket.

Продолжая пользование настоящим сайтом Вы выражаете свое согласие на обработку файлов-cookie, в том числе и с использованием сервиса «Яндекс Метрика», в соответствии с Политикой конфиденциальности и обработки персональных данных. Вы можете самостоятельно запретить обработку cookies в настройках своего браузера.