Вопрос на собеседовании · Fullstack-разработчик

Как обеспечить согласованность транзакции между сервисами?

Короткий ответ, ключевые тезисы и ошибки, которых стоит избежать на интервью.

Обновлено 19 августа 2026 г.Встречается почти всегда
Fullstack-разработчикПрофессии и разделы
Короткий ответ

У независимых сервисов обычно нет общей быстрой ACID-транзакции, поэтому цель — обеспечить корректный бизнес-процесс при повторах и частичных сбоях. Сервис атомарно сохраняет своё состояние и событие в локальной транзакции, после чего publisher доставляет событие через outbox; потребитель должен быть идемпотентным.

Saga разбивает процесс на локальные шаги и определяет компенсацию, если следующий шаг не состоялся. Нужны ключ операции, статус, retries с ограничением, дедупликация, DLQ и наблюдаемость; «exactly once» на уровне транспорта не отменяет необходимость проектировать эффект повторного сообщения.

01 · Структура ответа

Что важно сказать интервьюеру

Начните с определения, затем объясните механизм и закончите примером из практики. Для полного ответа раскройте эти тезисы:

Локальная транзакция защищает состояние одного сервиса.
Outbox закрывает разрыв между БД и публикацией.
Потребители обрабатывают дубликаты безопасно.
Компенсация — бизнес-действие, а не rollback БД.

02 · Пример

Как объяснить на практике

Заказ сохраняется как pending и в той же транзакции пишет событие OrderCreated. Платёжный сервис списывает деньги с ключом заказа и публикует результат; при отказе заказ отменяется, а уже созданный резерв товара освобождается отдельной компенсацией.

Не заучивайте формулировку дословно. Свяжите принцип с задачей из собственного проекта — интервьюер почти наверняка попросит уточнить детали реализации и компромиссы.

03 · Ошибки

Чего избегать в ответе

Делать распределённый commit без оценки доступности.
Считать очередь гарантией отсутствия дубликатов.
Не описывать статус и компенсацию пользователю.

04 · Углубление

Что могут спросить следом

  1. Что такое inbox?
  2. Когда достаточно eventual consistency?
  3. Как ретраить компенсацию?

Практика ответа

Ответьте вслух, а не про себя

Откроем тренировку сразу на этом вопросе. Выберите грейд, сформулируйте ответ и сравните его с подсказкой.

Потренировать ответ