Stateless-сервисы и почему это важно
Сервис без памяти о клиенте легко клонировать, заменять и масштабировать — в этом вся сила.
Stateless-сервис — сервис, который не хранит состояние между запросами в своей памяти: каждый запрос самодостаточен, и любой инстанс обработает его одинаково.
Stateful против stateless
Представьте корзину покупок. В stateful-варианте сервер хранит корзину в своей памяти. Тогда клиент обязан возвращаться на тот же сервер, иначе корзина «потеряется». В stateless-варианте корзина лежит в общем хранилище (Redis, БД), а сервер при каждом запросе читает её оттуда. Теперь любой инстанс обслужит клиента одинаково.
| Свойство | Stateful | Stateless |
| Где состояние | в памяти узла | во внешнем хранилище |
| Привязка клиента | нужна (sticky) | не нужна |
| Масштабирование | трудное | тривиальное — клонируй инстансы |
| Падение узла | потеря сессий на нём | незаметно, запрос уходит на другой |
| Деплой | сложный, теряем состояние | rolling update без боли |
Почему это ключ к масштабированию
Если узлы взаимозаменяемы, балансировщик может слать запрос на любой из них, добавлять и убирать инстансы по нагрузке (автоскейлинг), а падение узла не теряет данные клиента. Всё горизонтальное масштабирование держится на этой взаимозаменяемости.
Куда выносить состояние
| Вид состояния | Куда вынести |
| Сессия / токен входа | Redis, или подписанный JWT у клиента |
| Корзина, временные данные | Redis / Memcached |
| Постоянные данные | база данных |
| Файлы, картинки | объектное хранилище (S3) / CDN |
JWT как пример stateless-аутентификации
Вместо хранения сессии на сервере выдаём клиенту подписанный токен. В нём зашит идентификатор пользователя; сервер проверяет подпись и не обращается к общему хранилищу. Запрос самодостаточен — любой инстанс проверит токен сам.
{
"sub": "user-42",
"role": "editor",
"exp": 1718380800
}
Компромисс: такой токен трудно отозвать до истечения срока (сервер «не помнит» сессий), поэтому делают короткий срок жизни и refresh-токены.
Не всё бывает stateless
Базы данных, очереди, кэши — по природе stateful: они и есть состояние. Идея не в том, чтобы убрать состояние совсем, а в том, чтобы сосредоточить его в специально спроектированных хранилищах, а слой бизнес-логики держать stateless и легко масштабируемым.
Итог
- Stateless-сервис не помнит клиента между запросами — любой инстанс взаимозаменяем.
- Это делает масштабирование, автоскейлинг и переживание отказов простыми.
- Состояние выносят в Redis/БД/объектное хранилище; логику держат stateless.