Dovresti ritentare 500 errori API?

3

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:

  1. Quando stiamo bene con l'operazione in esecuzione più di una volta
  2. 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?

    
posta Eric S 06.12.2018 - 20:18
fonte

3 risposte

6

Questo si riduce a ciò che è peggio per l'operazione specifica non idempotente:

  • quando viene eseguito più volte o

  • quando non viene eseguito affatto.

Questa non è una decisione di progettazione tecnica, dipende dall'operazione specifica e dalle conseguenze di tali errori nel dominio.

Come misura tecnica, è possibile verificare se ci sono opzioni aggiuntive per la convalida se una determinata operazione è avvenuta (almeno con una certa probabilità). Prendiamo l'esempio dell'email: se l'API consente di inviare richieste di posta elettronica con una richiesta di copia nascosta inclusa, è possibile utilizzare questa funzione per inviare il proprio sistema come tale copia nascosta. Ciò ti dà l'opportunità di implementare un checkpoint aggiuntivo se l'e-mail originale è stata inviata o meno. Ovviamente, la copia nascosta potrebbe non raggiungere il tuo sistema in tempo a causa di un ritardo di rete, ma puoi ridurre la frequenza delle operazioni di posta elettronica duplicate tramite l'API.

O forse l'API stessa ti consentirà di ispezionare determinati stati o informazioni di registrazione per determinate operazioni. Anche se queste chiamate possono fallire, almeno potresti essere in grado di abbassare il tasso di errore ad un livello accettabile usando queste funzionalità.

Come principio di ingegneria generale: se hai un componente inaffidabile nel tuo sistema, crea abbastanza ridondanza per rendere il sistema "abbastanza affidabile".

    
risposta data 06.12.2018 - 20:36
fonte
4

Determina se la tua chiamata API è "almeno una volta", "al massimo una volta" o "esattamente una volta" ( collegamento ) in termini di urgenza. Per almeno una volta, scrivi una logica di riprova con qualche tipo di backoff (es. Backoff esponenziale). In altri casi, implementare un monitoraggio e un avviso migliori in modo da sapere quando le cose vanno male. Sposta le operazioni non riuscite in una coda e implementa un'interfaccia utente che ti consentirà di selezionare manualmente le operazioni dalla coda ed eseguirle.

    
risposta data 06.12.2018 - 20:42
fonte
0

Come regola generale, sì. 5xx sono "errori del server" e nel mondo delle API REST è un evento comune. NON frequente come il tuo caso, ma comune.

es. per le nostre API ospitate in AWS utilizzando i gateway API e Java Lambda lanciare 500/503/504 una volta ogni 2 giorni in media. E di solito passa il primo tentativo. I problemi sono problemi di infrastruttura transitoria, connettività del gateway, lamba non raggiungibile, problemi di rete ...

Tutte le chiamate REST devono essere ripetute con un ritardo esponenziale tra i tentativi di errori 5xx. Ci sono librerie disponibili in tutte le librerie, non usare per i loop.

L'idempionalità ovviamente complica un po 'le cose, ma vorrei essere una regola empirica. Per esempio. 503, 504 significa sicuramente che puoi riprovare. L'API deve fornire garanzie o fornire indicazioni sul suo comportamento per 500 s.

Naturalmente, secondo gli altri, ritengo che nessuna API a pagamento debba essere inattiva per 4 ore .

    
risposta data 08.12.2018 - 16:20
fonte

Leggi altre domande sui tag