Ваш цикл повторов предполагает, что первый запрос не удался. Скорее всего, это не так.
Таймаут или сбой не означают, что ваш API-запрос был потерян. Вот как ключи идемпотентности делают повторы безопасными, и как паттерн хранения на самом деле предотвращает дублирование.
Ваш сервис падает на полпути при обработке запроса . Клиент видит таймаут и повторяет запрос. Теперь у вас два списания. Клиент злится. База данных…