Очереди, потоки, события
Outbox: тест с выбором ответа
Шесть вопросов поперёк всего юнита. Каждый отражает решение, которое ты принимаешь в реальном инциденте — не определение для заучивания, а компромисс, который надо взвесить, когда запись и публикация обязаны произойти обе.
Убедись, что связываешь разрыв dual-write, фикс одной транзакцией, выбор polling vs CDC relay, гарантию at-least-once и операционный налог — тот синтез, к которому вёл урок.
Хендлер делает INSERT заказа, затем kafka.publish('OrderPlaced'). Под нагрузкой pod убивается по OOM после коммита, но до возврата publish. Какой сбой получается и почему try/catch не спасёт?
Почему запись бизнес-строки и outbox-строки в одной локальной transaction даёт атомарность «бесплатно», а 2PC между Postgres и Kafka — нет?
Команда гоняет polling relay с интервалом 1с и хочет, чтобы события прилетали быстрее. Они думают снизить до 25мс. Как это читает senior?
Почему outbox даёт at-least-once, а не exactly-once, и что это навязывает каждому консьюмеру?
Ты масштабируешь polling relay с одной реплики до трёх ради пропускной способности и сразу видишь, что каждое событие публикуется примерно трижды. Какой фикс?
Outbox-таблица выросла до нескольких сотен тысяч строк, polling-запросы замедляются, а ночной DELETE старых sent-строк вызывает конкуренцию блокировок с вставками. Какой дизайн очистки лучше?
Сквозная линия юнита — одна цепочка: dual-write поперёк двух хранилищ не имеет крах-безопасного порядка, поэтому ты схлопываешь его в одну локальную transaction, которая пишет бизнес-строку и outbox-строку вместе. Отдельный relay шлёт эти строки — polling (просто, но задержка ограничена интервалом и постоянная нагрузка на БД) или CDC (единицы мс, почти нулевая нагрузка на таблицу, ценой операций). Поскольку relay публикует, затем помечает sent двумя шагами, доставка at-least-once, поэтому консьюмеры дедупят по стабильному event id. Операционный налог — bloat таблицы, порядок при параллельных relay, конкурирующие реплики — оплачивается партиционированием, батчевым reaping, keying по aggregate и FOR UPDATE SKIP LOCKED.