Вопрос на собеседовании · Fullstack-разработчик
Как обеспечить согласованность транзакции между сервисами?
Короткий ответ, ключевые тезисы и ошибки, которых стоит избежать на интервью.
У независимых сервисов обычно нет общей быстрой ACID-транзакции, поэтому цель — обеспечить корректный бизнес-процесс при повторах и частичных сбоях. Сервис атомарно сохраняет своё состояние и событие в локальной транзакции, после чего publisher доставляет событие через outbox; потребитель должен быть идемпотентным.
Saga разбивает процесс на локальные шаги и определяет компенсацию, если следующий шаг не состоялся. Нужны ключ операции, статус, retries с ограничением, дедупликация, DLQ и наблюдаемость; «exactly once» на уровне транспорта не отменяет необходимость проектировать эффект повторного сообщения.
01 · Структура ответа
Что важно сказать интервьюеру
Раскройте тезисы, которые относятся именно к этому вопросу, и поясните их на собственном примере:
02 · Пример
Как объяснить на практике
Заказ сохраняется как pending и в той же транзакции пишет событие OrderCreated. Платёжный сервис списывает деньги с ключом заказа и публикует результат; при отказе заказ отменяется, а уже созданный резерв товара освобождается отдельной компенсацией.
Не заучивайте формулировку дословно. Свяжите принцип с задачей из собственного проекта — интервьюер почти наверняка попросит уточнить детали реализации и компромиссы.
03 · Ошибки
Чего избегать в ответе
04 · Углубление
Что могут спросить следом
- Что такое inbox?
- Когда достаточно eventual consistency?
- Как ретраить компенсацию?
05 · Проверка фактов
Первоисточники по теме
Ссылки ниже помогают проверить понятия, методы и ограничения по теме. Они не являются доказательством того, что этот вопрос задают на каждом собеседовании.
- Microsoft: Saga Design Pattern — Компенсации и согласованность без общей транзакции.
Практика ответа
Ответьте вслух, а не про себя
Откроем тренировку сразу на этом вопросе. Выберите грейд, сформулируйте ответ и сравните его с подсказкой.
Mira