Выбор ответа Middle CDC и инкрементальная загрузка спрашивают часто обновлено
Зачем transactional outbox
Вопрос
Сервис сохраняет заказ в PostgreSQL и затем публикует событие в Kafka. Иногда заказ есть, а события нет. Какой паттерн решает проблему?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Transactional outbox: событие пишется в таблицу outbox в одной транзакции с заказом, процесс публикует его. Две независимые записи не атомарны: между ними процесс может упасть.
Варианты ответа
- Публиковать событие до записи в базу, а при ошибке записи отправлять компенсирующее событие
- Повторять публикацию в Kafka в цикле с экспоненциальной паузой, пока брокер не подтвердит запись с acks=all
- Transactional outbox: событие пишется в таблицу outbox в одной транзакции с заказом, процесс публикует егоправильный ответ
- Распределённая транзакция между PostgreSQL и Kafka через двухфазный коммит (XA)
Разбор
Две независимые записи не атомарны: между ними процесс может упасть. Outbox превращает публикацию в часть локальной транзакции базы, а доставка из outbox гарантирует at-least-once. Публикация до записи даёт обратную проблему: событие есть, заказа нет. Бесконечный цикл не поможет, если процесс упал. Двухфазный коммит с Kafka не поддерживается и в целом сложен и хрупок.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Ещё по теме «CDC и инкрементальная загрузка»
- Удаления в аналитике
- Событие Debezium
- Transactional outbox
- Инкремент по водяному знаку
- Применить события Debezium к состоянию
- Поле op в событии Debezium
- Удаления при инкременте по updated_at
- Спроектируйте репликацию данных сервисов в хранилище через CDC