Что такое Stateful (с сохранением состояния)?

«Что такое Stateful (с сохранением состояния)?» — вопрос из категории Архитектура, который задают на 24% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Stateful (с сохранением состояния) — это архитектурный подход, при котором сервер хранит информацию о состоянии клиента (сессию) между отдельными запросами. Каждый последующий запрос от того же клиента обрабатывается в контексте данных, сохраненных от предыдущих запросов.

Ключевые характеристики:

  • Зависимость между запросами: Сервер «помнит» клиента. Обработка текущего запроса зависит от истории взаимодействия.
  • Хранение состояния на сервере: Данные сессии (корзина покупок, данные формы, прогресс) хранятся в памяти сервера, в общей памяти (например, Redis) или в базе данных.
  • Идентификация клиента: Для связывания запроса с конкретной сессией используется идентификатор (Session ID), который обычно передается через cookie или параметр URL.

Типичный пример в PHP:

// Начало сессии (состояние хранится на сервере, ID — в cookie PHPSESSID)
session_start();

// Инициализация или использование состояния
if (!isset($_SESSION['cart'])) {
    $_SESSION['cart'] = []; // Создаем пустую корзину при первом визите
}

// Добавление товара в корзину (состояние сохраняется между запросами)
$_SESSION['cart'][] = ['product_id' => 123, 'quantity' => 2];

// В другом запросе корзина будет доступна
echo 'Товаров в корзине: ' . count($_SESSION['cart']);

Где используется:

  • Аутентификация пользователей (логин/сессия).
  • Корзины покупок в интернет-магазинах.
  • Многошаговые формы (wizards).
  • Приложения в реальном времени с долгоживущими соединениями (WebSocket).

Недостатки:

  • Сложность масштабирования: Для горизонтального масштабирования (несколько серверов) требуется общее хранилище сессий (например, Redis), иначе пользователь будет «привязан» к одному серверу (sticky sessions).
  • Потребление ресурсов: Сервер должен выделять память/диск для хранения состояния всех активных клиентов.
  • Снижение отказоустойчивости: Потеря сервера с состоянием может привести к потере данных сессии.

Stateful противопоставляется Stateless-архитектуре, где сервер не хранит состояние клиента между запросами.