tecnico · risposta con fonti

Tentativi con backoff esponenziale

Il backoff esponenziale è una strategia di gestione degli errori in cui l'attesa tra un nuovo tentativo e il successivo di un'operazione fallita cresce in modo esponenziale. Invece di ritentare a intervalli fissi, il sistema attende sempre più a lungo dopo ogni fallimento, per dare al server ricevente il tempo di riprendersi da congestioni o interruzioni temporanee.

Funzionamento

Il processo parte da un'attesa iniziale, ad esempio un secondo. Se il primo nuovo tentativo fallisce, l'attesa viene moltiplicata per un fattore costante, di solito due. Il secondo tentativo avviene dopo due secondi, il terzo dopo quattro, il quarto dopo otto e così via. Questa progressione geometrica continua finché non si raggiunge una soglia massima di attesa o un numero massimo di tentativi: a quel punto il messaggio viene contrassegnato come fallimento permanente.

Perché conta per chi invia

Questo metodo evita che un mittente sferri involontariamente un attacco Denial of Service contro un server di posta ricevente. Se migliaia di messaggi falliscono contemporaneamente e vengono tutti ritentati ogni dieci secondi, il picco di traffico risultante può tenere offline il destinatario. Distribuendo i nuovi tentativi nel tempo, i mittenti mantengono una reputazione migliore e aumentano la probabilità che un errore SMTP temporaneo 4xx si risolva prima che il messaggio venga scartato.

Aspetti operativi

Un'aggiunta fondamentale a questa strategia è il jitter, che aggiunge all'attesa una piccola componente casuale. Senza jitter, più richieste fallite nello stesso momento vengono ritentate a ondate sincronizzate, generando picchi di traffico. Con il jitter i nuovi tentativi si distribuiscono in modo uniforme nella finestra temporale, riducendo ulteriormente il carico sull'infrastruttura.

Errori di implementazione comuni

Spesso gli sviluppatori dimenticano di impostare un limite massimo di tentativi o un tetto all'attesa. Senza un tetto, l'attesa può arrivare a ore o giorni, con una latenza inaccettabile per le email transazionali. Un altro errore è considerare ritentabili i fallimenti permanenti 5xx: il backoff esponenziale va applicato solo agli errori transitori 4xx, come il limite di frequenza (rate limit) o il greylisting temporaneo.

Esempio concreto

Considera un'email transazionale inviata tramite API. Il tentativo 1 fallisce con un errore 421 server busy. Il sistema attende 2 secondi. Il tentativo 2 fallisce e il sistema attende 4 secondi. Il tentativo 3 fallisce e il sistema attende 8 secondi. Al momento del tentativo 4, il server ricevente avrà probabilmente smaltito la coda e accetterà l'email. SendHQ offre strumenti gratuiti su https://sendhq.cc/tools per gestire in modo efficiente l'infrastruttura email.

Le domande dei team

Qual è la differenza tra backoff fisso ed esponenziale?

Il backoff fisso ritenta ogni X secondi indipendentemente dal numero di fallimenti. Il backoff esponenziale aumenta l'intervallo dopo ogni fallimento per ridurre il carico sul server di destinazione.

Quando bisogna smettere di ritentare?

Smetti di ritentare quando ricevi un fallimento permanente 5xx, quando raggiungi il numero massimo di tentativi o quando raggiungi il tetto massimo di attesa.

Il jitter influisce sulla crescita esponenziale?

No, il jitter aggiunge uno scostamento casuale all'attesa esponenziale calcolata, per evitare picchi di tentativi sincronizzati tra più richieste concorrenti.

Fonti primarie