Получить доступ

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

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

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

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

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

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

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

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

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

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

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

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

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

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

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

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

Разбор темы

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

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем