Вопрос проверяет понимание архитектурных компромиссов между stateful и stateless-подходами и причин, по которым миграция становится дорогой на поздних этапах проекта.
Stateful-архитектура означает, что сервер помнит состояние клиента между запросами: сессию в памяти, открытые соединения, кэш, промежуточные вычисления. Stateless-подход требует, чтобы каждый запрос был самодостаточным, а состояние хранилось во внешних системах (Redis, БД, JWT). На ранних этапах переход дешёв, потому что кода мало и связей почти нет.
// Stateful: сессия живёт в памяти процесса
const sessions = new Map();
app.post('/login', (req, res) => {
const id = crypto.randomUUID();
sessions.set(id, { user: req.body.user });
res.cookie('sid', id);
});
// Stateless: состояние в Redis или JWT
app.post('/login', async (req, res) => {
const token = jwt.sign({ user: req.body.user }, SECRET);
res.cookie('token', token);
});
Во втором варианте любой инстанс может обработать запрос, потому что состояние не привязано к процессу. Но чтобы прийти к этому, нужно переписать аутентификацию, кэши, фоновые задачи и договориться с клиентами о новом формате токенов.
Stateless-архитектура упрощает масштабирование, отказоустойчивость и деплой, но требует дисциплины: состояние всегда должно быть явным и внешним. Применять переход стоит, когда сервис начинает масштабироваться горизонтально или когда появляются требования к zero-downtime-деплою.