Вопрос с собеседования · System design

Почему для надёжной публикации события после изменения данных применяют transactional outbox, а не двухфазный коммит?

SeniorНадёжность и идемпотентность
Ещё спрашивают так:
  • Что такое transactional outbox?
  • Как надёжно опубликовать событие после записи в базу?
Коротко

Проблема двойной записи: между коммитом в базу и отправкой в брокер можно упасть. Outbox пишет событие строкой в ту же транзакцию, а отдельный процесс публикует его в брокер.

  • Двухфазный коммит избегают: координатор — точка отказа, блокировки, слабая поддержка брокерами
  • Публикатор: опрос таблицы или чтение журнала базы (Debezium)
  • Доставка «хотя бы один раз» — потребители идемпотентны

А ещё Порядок событий одного агрегата сохраняют ключом партиции

Подробно

Двухфазный коммит теоретически решает задачу, но на практике его избегают: координатор становится единой точкой отказа, участники держат блокировки до его решения, доступность падает, а поддержка со стороны брокеров ограничена. Outbox проще: событие записывается строкой в ту же базу и тем же коммитом, что и бизнес-данные, поэтому оба изменения либо есть, либо нет. Отдельный публикатор — опрос таблицы или чтение журнала базы через захват изменений — забирает записи и отправляет в брокер, помечая отправленные. Важно честно сказать про гарантию: доставка получается не менее одного раза, потому что упасть можно между отправкой и отметкой, — поэтому потребитель обязан быть идемпотентным, и полноценного exactly-once здесь нет.

Что хотят услышать

  • Суть проблемы двойной записи.
  • Механика outbox и способы публикации.
  • Почему не двухфазный коммит.
  • Идемпотентность потребителей.

Частые ошибки

  • Отправлять событие сразу после коммита и считать это надёжным.
  • Обещать exactly-once вместо at-least-once с идемпотентной обработкой.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✗Двухфазный коммит запрещён спецификацией брокеров
  • ✗Outbox быстрее, потому что не требует записи в базу
  • ✓У базы и брокера нет общей транзакции; outbox сводит всё к одной локальной транзакции
  • ✗Outbox гарантирует ровно однократную доставку события получателю, а двухфазный коммит — нет

Что спросят дальше

  • Чем чтение журнала базы лучше опроса таблицы outbox?
  • Как обеспечить идемпотентность на стороне потребителя?

Разбор темы

Связанные вопросы

Партнёр платформы

Разбор собеседования с sotto

После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.

Разбор собеседования