Seu loop de retry assume que a primeira requisição falhou. Provavelmente, não falhou.
Um timeout ou crash não significa que sua requisição de API foi perdida. Veja como idempotency keys tornam retries seguros, e o padrão de armazenamento que realmente previne duplicatas.
Seu serviço quebra no meio de uma requisição . O cliente vê um timeout e faz retry. Agora você tem duas cobranças. O cliente está irritado. O banco de dados…