После повторной доставки сообщения клиенту дважды списали деньги
Потребитель обрабатывает сообщения о платежах: создаёт проводку и списывает деньги. В инциденте воркер успел выполнить списание, но упал до подтверждения обработки сообщения (ack в очереди / фиксация смещения). После перезапуска брокер выдал то же сообщение снова, и списание произошло второй раз.
Как правильно защититься от таких дублей?
- Сделать обработчик идемпотентным: писать идентификатор операции с уникальным ограничением
- Подтверждать сообщение сразу при получении, до начала обработки — тогда повторов не будет
- Оставить одного потребителя: при единственном воркере повторная доставка невозможна
- Хранить в памяти процесса множество обработанных идентификаторов и пропускать повторы
