Воркер упал после записи в БД, но до подтверждения сообщения
Сообщение «начислить кэшбэк» обрабатывается воркером: он пишет проводку в БД и затем подтверждает сообщение брокеру. Изредка процесс убивают деплоем ровно между этими шагами. После перезапуска сообщение приходит снова, и кэшбэк начисляется второй раз.
Что верно?
- Брокер доставляет сообщение как минимум один раз: при падении до подтверждения оно вернётся в очередь, поэтому обработчик должен быть идемпотентным
- Подтверждать сообщение сразу при получении, до обработки: тогда повторов не будет вовсе, а редкие потери закроет ночная сверка
- Включить в настройках брокера режим доставки ровно один раз: он снимает проблему целиком и без правок в коде обработчика
- Обернуть обработку в транзакцию БД: при падении процесса она откатит и проводку, и подтверждение сообщения в брокере
