В распределенных системах нельзя полагаться на гарантию «Exactly-Once» (доставка ровно один раз). Чаще всего мы имеем дело с «At-Least-Once» (доставка как минимум один раз).
Если консьюмер успешно обработал событие (начислил деньги), но ответ потерялся по сети, брокер подумает, что консьюмер умер, и отправит это же событие еще раз. Если твоя бизнес-логика не защищена, пользователь получит деньги дважды.ACK
Решения проблемы
Идемпотентные обработчики
Логика пишется так, чтобы повторное выполнение не меняло состояние.
- Плохо:
Баланс += 100 - Хорошо:
Статус_заказа = ОПЛАЧЕН(даже если выполнить это 10 раз, статус останется прежним)
Таблица дедупликации (Idempotency Key)
Каждому событию выдается уникальный . Консьюмер заводит у себя в БД таблицу Event_ID. Прежде чем обработать событие, он проверяет: «А делал ли я это раньше?». Если ID есть в таблице — событие просто игнорируется.processed_events