Получить доступ

Почему для горизонтального масштабирования сервис делают stateless?

MiddleМасштабирование
Ещё спрашивают так:
  • Что значит stateless-сервис?
  • Где хранить сессии при нескольких экземплярах?
Коротко

Stateless — состояние не в памяти экземпляра, а в базе, кэше, брокере или токене. Экземпляры взаимозаменяемы: запрос можно отправить в любой.

  • Это даёт автомасштабирование, выкатку без простоя и спокойную потерю узла
  • Нарушители: сессии в памяти, файлы на локальном диске, локальный кэш изменяемых данных, фоновые задачи без координации
  • Sticky sessions лечат симптом ценой неравномерной нагрузки и потерь при выкатке

А ещё Локальный кэш допустим как необязательное ускорение с коротким TTL

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

Stateless не означает отсутствия состояния вообще — оно есть, но живёт в базе, кэше или брокере, а не в памяти конкретного экземпляра. Это и делает возможными автоскейл, выкатку без простоя и безболезненную потерю узла. Локальное состояние ломает всё перечисленное: пользователь привязывается к экземпляру, перезапуск теряет сессию, а нагрузка распределяется неравномерно. Типичные нарушители, которые стоит назвать: сессии в памяти, локальные кэши с изменяемыми данными, файлы, записанные на диск экземпляра, и планировщики, запускающие задачу на каждом инстансе. Если состояние по своей природе локально, его выносят во внешнее хранилище или изолируют в отдельный сервис.

Что хотят услышать

  • Определение: состояние вынесено наружу, а не отсутствует.
  • Что это даёт для масштабирования и выкаток.
  • Типичные нарушители и куда их выносить.

Частые ошибки

  • Считать локальный кэш безобидным — он расходится между экземплярами.
  • Полагаться на липкие сессии как на решение вместо внешнего хранилища.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✓Любой экземпляр может обслужить любой запрос, поэтому инстансы свободно добавляются, снимаются и перезапускаются без потери пользовательского состояния
  • ✗Stateless-сервисы работают быстрее за счёт отсутствия переменных
  • ✗Только stateless-сервисы можно размещать в контейнерах
  • ✗Stateless означает, что сервис не обращается к базе данных

Что спросят дальше

  • Как быть с задачами по расписанию при нескольких экземплярах?
  • Чем плохи липкие сессии при частых выкатках?

Разбор темы

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем