К основному содержимому

Стабильность досок при большом числе участников

Realtime без тормозов: доска RetroPoint и участники, подключённые к обновлениям в реальном времени

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

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

В чём была проблема

Обновления доски идут через SSE (Server-Sent Events) — длинное соединение, по которому сервер «пушит» изменения. Оказалось, что при множестве одновременных подключений сервер слишком долго держал служебные соединения с базой данных на каждый такой поток. Свободные «слоты» заканчивались — новые запросы, в том числе обычное открытие доски или ввод пароля гостем, начинали падать с ошибкой 500.

Проще говоря: realtime работал, но при пиковой одновременной активности пул соединений мог исчерпываться — и это как раз тот сценарий, который случается на живом спринт-ретро.

Что мы исправили

  • Переработали SSE: соединение с базой больше не «висит» на всё время просмотра доски — push-события по-прежнему приходят мгновенно.
  • Увеличили запас по параллельным запросам на production: больше worker'ов API и шире пул соединений к PostgreSQL.
  • Подкрутили поллинг для гостей без активного SSE — реже лишние запросы, когда push уже работает.

Изменения уже на retropoint.ru. Параллельно поправили сценарий с модалкой пароля для анонимного доступа к защищённой публичной доске.

Что показали бенчмарки

После деплоя мы прогнали нагрузочные тесты на реальном production — с интернета, через HTTPS, как у обычного пользователя: гостевой unlock, полный bundle доски, десятки параллельных SSE-подключений.

  • 25 одновременных гостей (типичное ретро) — 0 ошибок, всё стабильно.
  • 50 гостей с частым опросом доски — 0 ошибок сервера; латентность выше, но без падений.
  • 80 параллельных SSE-подключений (realtime) — все успешны, утечек соединений с базой нет.
  • Главный технический индикатор (зависшие транзакции в PostgreSQL) — 0 после нагрузки; до фикса было 12–13 постоянно.

Что это значит для вас

  • Обычное ретро на 15–30 человек — с большим запасом, как и задумывалось.
  • Публичные доски с паролем для гостей снова открываются предсказуемо.
  • Realtime (карточки, голоса, таймер) — без деградации при типичной нагрузке.

Если что-то всё же пойдёт не так — напишите в поддержку: теперь у нас есть воспроизводимые сценарии нагрузки, чтобы быстро проверить подобные случаи.

Спасибо

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