Почему для надёжной публикации события после изменения данных применяют transactional outbox, а не двухфазный коммит?
- Что такое transactional outbox?
- Как надёжно опубликовать событие после записи в базу?
Проблема двойной записи: между коммитом в базу и отправкой в брокер можно упасть. Outbox пишет событие строкой в ту же транзакцию, а отдельный процесс публикует его в брокер.
- Двухфазный коммит избегают: координатор — точка отказа, блокировки, слабая поддержка брокерами
- Публикатор: опрос таблицы или чтение журнала базы (Debezium)
- Доставка «хотя бы один раз» — потребители идемпотентны
А ещё Порядок событий одного агрегата сохраняют ключом партиции
Подробно
Двухфазный коммит теоретически решает задачу, но на практике его избегают: координатор становится единой точкой отказа, участники держат блокировки до его решения, доступность падает, а поддержка со стороны брокеров ограничена. Outbox проще: событие записывается строкой в ту же базу и тем же коммитом, что и бизнес-данные, поэтому оба изменения либо есть, либо нет. Отдельный публикатор — опрос таблицы или чтение журнала базы через захват изменений — забирает записи и отправляет в брокер, помечая отправленные. Важно честно сказать про гарантию: доставка получается не менее одного раза, потому что упасть можно между отправкой и отметкой, — поэтому потребитель обязан быть идемпотентным, и полноценного exactly-once здесь нет.
Что хотят услышать
- Суть проблемы двойной записи.
- Механика outbox и способы публикации.
- Почему не двухфазный коммит.
- Идемпотентность потребителей.
Частые ошибки
- Отправлять событие сразу после коммита и считать это надёжным.
- Обещать exactly-once вместо at-least-once с идемпотентной обработкой.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✗Двухфазный коммит запрещён спецификацией брокеров
- ✗Outbox быстрее, потому что не требует записи в базу
- ✓У базы и брокера нет общей транзакции; outbox сводит всё к одной локальной транзакции
- ✗Outbox гарантирует ровно однократную доставку события получателю, а двухфазный коммит — нет
Что спросят дальше
- Чем чтение журнала базы лучше опроса таблицы outbox?
- Как обеспечить идемпотентность на стороне потребителя?
Разбор темы
- Надёжность и идемпотентность
Управляемая деградация вместо каскада, таймауты и бюджет времени запроса, безопасные ретраи и их мультипликация, идемпотентность как фундамент, предохранитель, отсеки и сброс нагрузки, transactional outbox вместо 2PC.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.