Ogni chiamata a un servizio esterno può fallire: rete instabile, server sovraccarico, timeout. Un'applicazione robusta lo mette in conto fin dall'inizio.
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.