loading experience

.NET

HttpClient resiliente in .NET: retry, timeout e circuit breaker

Chiamare servizi esterni senza far cadere l'applicazione quando loro rallentano o falliscono.

HttpClient resiliente in .NET: retry, timeout e circuit breaker

Ogni chiamata a un servizio esterno può fallire: rete instabile, server sovraccarico, timeout. Un'applicazione robusta lo mette in conto fin dall'inizio.

Ogni chiamata attraversa i livelli nell'ordine, dall'esterno verso l'interno.
Ogni chiamata attraversa i livelli nell'ordine, dall'esterno verso l'interno.

IHttpClientFactory

Creare un HttpClient nuovo per ogni chiamata esaurisce le connessioni; tenerne uno solo per sempre ignora i cambi di DNS. La factory gestisce entrambe le cose ed è il modo consigliato.

builder.Services.AddHttpClient<MeteoClient>(c =>
{
    c.BaseAddress = new Uri("https://api.meteo.example/");
    c.Timeout = TimeSpan.FromSeconds(30);
})
.AddStandardResilienceHandler();

Il gestore di resilienza standard

Il pacchetto Microsoft.Extensions.Http.Resilience aggiunge con una riga una pipeline già pensata: limite di richieste concorrenti, timeout totale, retry con attesa crescente e casuale, circuit breaker e timeout per singolo tentativo. I valori si possono adattare:

.AddStandardResilienceHandler(o =>
{
    o.Retry.MaxRetryAttempts = 3;
    o.AttemptTimeout.Timeout = TimeSpan.FromSeconds(5);
    o.TotalRequestTimeout.Timeout = TimeSpan.FromSeconds(20);
});

Il client tipizzato

public class MeteoClient(HttpClient http)
{
    public Task<Previsione?> OggiAsync(string citta, CancellationToken ct) =>
        http.GetFromJsonAsync<Previsione>($"previsioni/{Uri.EscapeDataString(citta)}", ct);
}

Attenzione ai retry

Ripetere una lettura è sicuro; ripetere un pagamento no. Le operazioni che modificano dati vanno ripetute solo se sono idempotenti, per esempio grazie a una chiave di idempotenza inviata al server. E quando il servizio esterno è giù a lungo, il circuit breaker smette di tempestarlo e restituisce subito un errore gestibile.

Commenti (0)

Nessun commento ancora.

Lascia un commento