Выбор ответа Senior Кеш и очереди обновлено

Exactly-once при обработке сообщений

Вопрос

Команда хочет «exactly-once» обработку платёжных событий из брокера с записью в PostgreSQL. Какой подход реально даёт эффект «ровно один раз»?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: At-least-once плюс id сообщения в той же транзакции под unique. Гарантии брокера заканчиваются на брокере: exactly-once в Kafka касается цепочек чтение-обработка-запись внутри Kafka (транзакции), а запись во внешнюю БД и подтверждение офсета это две разные системы, между ними всегда возможен сбой.

Варианты ответа

  1. Включить в брокере режим exactly-once, и повторов не будет и в базе
  2. Подтверждать сообщение до обработки, тогда повторной доставки не будет
  3. Обрабатывать все сообщения в одном потоке строго по порядку
  4. At-least-once плюс id сообщения в той же транзакции под uniqueправильный ответ

Разбор

Гарантии брокера заканчиваются на брокере: exactly-once в Kafka касается цепочек чтение-обработка-запись внутри Kafka (транзакции), а запись во внешнюю БД и подтверждение офсета это две разные системы, между ними всегда возможен сбой. Рабочая схема: брокер доставляет хотя бы один раз, обработчик идемпотентен. Надёжнее всего записать id сообщения в таблицу обработанных в той же транзакции, что и бизнес-изменение: повтор упадёт на уникальном ограничении и будет пропущен.

Подтверждение до обработки даёт «не больше одного раза»: при падении сообщение потеряется. Один поток не убирает повторную доставку.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.