Ответ
At-Least-Once (Как минимум один раз) — это гарантия в распределенных системах, что сообщение будет доставлено и обработано минимум один раз.
Это означает, что система допускает повторную доставку и обработку одного и того же сообщения, но не допускает его потерю.
Как это работает (на примере Kafka):
- Получение: Потребитель (consumer) получает сообщение от брокера.
- Обработка: Потребитель выполняет бизнес-логику (например, сохраняет данные в БД).
- Подтверждение (Commit): Только после успешной обработки потребитель отправляет брокеру подтверждение (коммит), что сообщение обработано.
Если потребитель падает после обработки, но до подтверждения, брокер не получит коммит и отправит это же сообщение повторно другому (или этому же перезапущенному) потребителю. Это приводит к дублированию.
Ключевой аспект — Идемпотентность:
Чтобы избежать проблем с дубликатами, обработчик сообщения должен быть идемпотентным. Это значит, что повторное выполнение операции с теми же входными данными не изменяет состояние системы. Например, операция UPDATE users SET balance = 100 WHERE id = 1
идемпотентна, а UPDATE users SET balance = balance + 100 WHERE id = 1
— нет.
Когда используется:
- В системах, где потеря данных критически недопустима: финансовые транзакции, обработка заказов, важные логи.
Альтернативы:
- At-Most-Once (Не более одного раза): Быстро, но возможны потери.
- Exactly-Once (Ровно один раз): Идеальный вариант, но сложный и дорогой в реализации.