Идемпотентность и дубли

В распределенных системах нельзя полагаться на гарантию «Exactly-Once» (доставка ровно один раз). Чаще всего мы имеем дело с «At-Least-Once» (доставка как минимум один раз).

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

Решения проблемы

Идемпотентные обработчики

Логика пишется так, чтобы повторное выполнение не меняло состояние.

  • Плохо: Баланс += 100
  • Хорошо: Статус_заказа = ОПЛАЧЕН (даже если выполнить это 10 раз, статус останется прежним)

Таблица дедупликации (Idempotency Key)

Каждому событию выдается уникальный Event_ID. Консьюмер заводит у себя в БД таблицу processed_events. Прежде чем обработать событие, он проверяет: «А делал ли я это раньше?». Если ID есть в таблице — событие просто игнорируется.