Ответ
Сервис был stateless (без состояния). Это означает, что каждый HTTP-запрос обрабатывался независимо и содержал всю необходимую информацию (например, токен аутентификации в заголовке). Сервер не хранил состояние сессии клиента между запросами.
Причины выбора stateless-архитектуры:
- Масштабируемость: Любой экземпляр сервиса может обработать любой запрос. Это позволяет легко добавлять новые инстансы за балансировщиком нагрузки (например, Kubernetes ReplicaSet).
- Отказоустойчивость: Падение одного инстанса не влияет на пользователей, так как их следуюший запрос может быть обработан другим, здоровым инстансом.
- Упрощение: Нет необходимости синхронизировать состояние между разными серверами или использовать sticky sessions.
Техническая реализация (пример на Spring Boot):
@RestController
public class StatelessAuthController {
// Stateless: токен передается в каждом запросе
@GetMapping("/api/data")
public ResponseEntity<Data> getData(@RequestHeader("Authorization") String authToken) {
// 1. Валидация токена (например, JWT)
User user = jwtService.validateToken(authToken);
// 2. Обработка запроса на основе данных из токена
Data data = dataService.findForUser(user.getId());
return ResponseEntity.ok(data);
}
}
Контраст с Stateful подходом:
В stateful-архитектуре состояние (например, объект сессии) хранится на сервере и привязывается к клиенту (часто через cookie JSESSIONID). Это усложняет масштабирование, так как требует репликации сессий или их внешнего хранения (например, в Redis).
Вывод: Выбор stateless подхода был обусловлен требованиями к горизонтальному масштабированию и высокой доступности сервиса в облачном окружении.