Проверяет понимание разницы между stateless и stateful архитектурами, что критично для проектирования масштабируемых сервисов и выбора стратегии хранения состояния.
Stateless и stateful — это два подхода к тому, как приложение относится к состоянию клиента между запросами. В stateless-модели сервер не помнит ничего о предыдущих взаимодействиях: каждый запрос содержит всю информацию, необходимую для его обработки. В stateful-модели сервер хранит данные о клиенте (сессию, корзину, прогресс) и использует их при следующих запросах.
Классический пример — REST API с JWT-токеном. Клиент присылает токен в каждом запросе, сервер проверяет подпись и извлекает пользователя. Серверу не нужно хранить сессии, поэтому любой инстанс приложения может обработать запрос.
// Express: stateless-обработчик
app.get('/profile', (req, res) => {
const token = req.headers.authorization?.split(' ')[1];
const user = verifyJwt(token); // вся инфа в токене
res.json({ id: user.id, name: user.name });
});Пример — серверные сессии в памяти или WebSocket-соединение. Сервер хранит объект сессии и привязывает клиента к конкретному процессу. При горизонтальном масштабировании нужен sticky session или внешнее хранилище (Redis).
// Express + express-session: stateful
app.use(session({ store: new RedisStore({ client }) }));
app.post('/cart/add', (req, res) => {
req.session.cart = req.session.cart || [];
req.session.cart.push(req.body.itemId);
res.json({ cart: req.session.cart });
});На практике часто комбинируют подходы: приложение stateless, а состояние выносят во внешние хранилища (Redis, БД), что даёт лучшее из двух миров.
Итог: выбирайте stateless для API и микросервисов, где важны масштабируемость и отказоустойчивость; stateful уместен там, где нужны долгоживущие соединения или сложное состояние (игры, чаты, сессии).