Что такое семантика доставки «At-Least-Once» (Как минимум один раз)?

Ответ

At-Least-Once (Как минимум один раз) — это гарантия в распределенных системах, что сообщение будет доставлено и обработано минимум один раз.

Это означает, что система допускает повторную доставку и обработку одного и того же сообщения, но не допускает его потерю.

Как это работает (на примере Kafka):

  1. Получение: Потребитель (consumer) получает сообщение от брокера.
  2. Обработка: Потребитель выполняет бизнес-логику (например, сохраняет данные в БД).
  3. Подтверждение (Commit): Только после успешной обработки потребитель отправляет брокеру подтверждение (коммит), что сообщение обработано.

Если потребитель падает после обработки, но до подтверждения, брокер не получит коммит и отправит это же сообщение повторно другому (или этому же перезапущенному) потребителю. Это приводит к дублированию.

Ключевой аспект — Идемпотентность:

Чтобы избежать проблем с дубликатами, обработчик сообщения должен быть идемпотентным. Это значит, что повторное выполнение операции с теми же входными данными не изменяет состояние системы. Например, операция UPDATE users SET balance = 100 WHERE id = 1 идемпотентна, а UPDATE users SET balance = balance + 100 WHERE id = 1 — нет.

Когда используется:

  • В системах, где потеря данных критически недопустима: финансовые транзакции, обработка заказов, важные логи.

Альтернативы:

  • At-Most-Once (Не более одного раза): Быстро, но возможны потери.
  • Exactly-Once (Ровно один раз): Идеальный вариант, но сложный и дорогой в реализации.