Вопрос проверяет понимание моделей доставки сообщений и надежности очередей.
at-least-once означает, что сообщение будет доставлено минимум один раз, но возможны дубликаты. exactly-once означает, что сообщение будет обработано ровно один раз. Достичь exactly-once сложнее и требует дополнительных механизмов. Большинство систем по умолчанию работают в режиме at-least-once.
В распределенных системах невозможно одновременно гарантировать:
отсутствие потерь
отсутствие дублей
простоту реализации
Поэтому используются разные модели доставки.
Определение:
Сообщение гарантированно будет доставлено хотя бы один раз.
Особенности:
Возможны дубликаты
Требуется идемпотентная обработка
Реализация относительно проста
Пример сценария:
сообщение обработано
подтверждение не дошло
брокер отправил повторно
Определение:
Сообщение будет обработано ровно один раз.
Особенности:
Требует транзакций или дедупликации
Сложнее реализуется
Может снижать производительность
Kafka поддерживает такой режим при определенных условиях.
Очереди задач
Логи событий
Обработка платежей с идемпотентностью
На практике чаще выбирают at-least-once и обеспечивают идемпотентность обработки.