Il mio team e io ci stiamo integrando con una società di terze parti e stiamo utilizzando le loro API per eseguire diverse operazioni CRUD. Tuttavia, la loro API non è sempre affidabile. Forse lo 0,1% del tempo in cui una chiamata API fallisce con un errore di 500, e poi quando ci riprovi, funziona bene. Occasionalmente, avranno tempi in cui la chiamata API non riesce con un errore 500 oltre il 90% delle volte. Dopo ~ 10 tentativi, funzionerà alla fine. Di solito dura per circa 4 ore e si verifica ogni pochi mesi. Lo abbiamo sperimentato ieri, quando il 90% delle volte la chiamata all'API falliva.
La terza parte ci ha detto che dovremmo implementare una logica di riprova quando si riceve un errore 500. Per le operazioni idempotent, potrei vedere questo essere utile. Tuttavia, per le operazioni non idempotenti sembra che potrebbe essere pericoloso. Ad esempio, una chiamata API potrebbe essere quella di inviare un'e-mail. A volte abbiamo notato che l'API potrebbe restituire un errore di 500, anche se l'email è stata inviata. Se riprovo la chiamata API 10 volte, potrei ottenere 10 500 errori, ma il destinatario potrebbe comunque ricevere 10 email. Questo potrebbe essere molto cattivo.
Dovremmo aggiungere la logica di retry per 500 errori che non sono idempotenti?
Le mie due riflessioni su quando dovremmo aggiungere un nuovo tentativo:
- Quando stiamo bene con l'operazione in esecuzione più di una volta
- Quando l'operazione fallisce è peggio dell'operazione che succede 10 volte (o qualunque sia il limite dei tentativi).
Non ho mai dovuto aggiungere una logica retry alle chiamate API perché ottenere 500 errori è molto sottile. È ragionevole farlo?