Был ли ваш сервис в последнем проекте stateful или stateless? Почему был выбран такой подход?

«Был ли ваш сервис в последнем проекте stateful или stateless? Почему был выбран такой подход?» — вопрос из категории Архитектура, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Сервис был 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 подхода был обусловлен требованиями к горизонтальному масштабированию и высокой доступности сервиса в облачном окружении.