Какие типы гарантии доставки сообщений существуют в брокерах сообщений
Что проверяют
Понимаете ли вы, что гарантия доставки это договорённость между продюсером, брокером и потребителем, а не галочка в настройках брокера. Системного аналитика следом просят описать, что будет с интеграцией при дубле или потере сообщения и как это зафиксировать в требованиях.
Как отвечать
Три уровня:
- at-most-once, не более одного раза: подтверждение до обработки, при сбое сообщение теряется, дублей нет. Годится для метрик и необязательных уведомлений;
- at-least-once, хотя бы один раз: подтверждение после обработки, при сбое сообщение придёт повторно. Практический стандарт для большинства интеграций;
- exactly-once, ровно один раз: эффект обработки наступает один раз. Дешевле всего достигается как at-least-once плюс идемпотентный потребитель.
Покажите на брокерах. В Kafka продюсер с acks=all и enable.idempotence=true (оба по умолчанию с версии 3.0) не пишет дублей при ретраях, а транзакции с isolation.level=read_committed дают exactly-once для цепочки «прочитал из топика, записал в топик». Как только результат уходит во внешнюю базу или API, гарантия снова держится на вашей идемпотентности. В RabbitMQ есть publisher confirms и ручной ack, это at-least-once.
Что аналитик кладёт в требования:
- ключ идемпотентности: уникальный
message_idили бизнес-ключ операции в контракте сообщения; - inbox: таблица обработанных сообщений или уникальный индекс, чтобы повтор отбрасывался;
- transactional outbox у отправителя: запись в базу и событие в одной транзакции, без потери при падении между ними;
- DLQ и политика повторов для сообщений, которые не удаётся обработать.
Где спотыкаются
Переводят at-most-once как «по крайней мере один раз» и путают уровни местами. Most значит «не больше».
Верят, что exactly-once включается в брокере и работает до конца цепочки. Двойное списание денег предотвращает только идемпотентность получателя.
Смешивают гарантию доставки с порядком. Kafka держит порядок лишь внутри партиции, и требование «события клиента по порядку» означает ключ партиционирования по клиенту.