Partager via


Implémenter des tentatives d’appel HTTP avec backoff exponentiel avec des stratégies IHttpClientFactory et Polly

Conseil / Astuce

Ce contenu est un extrait du livre électronique 'Architecture des microservices .NET pour les applications .NET conteneurisées', disponible sur .NET Docs ou en tant que PDF téléchargeable gratuitement, lisible hors ligne.

Architecture de microservices .NET pour les applications .NET conteneurisées - vignette de couverture du livre électronique.

L’approche recommandée pour les nouvelles tentatives avec interruption exponentielle est d’utiliser des bibliothèques .NET plus avancées telles que la bibliothèque Polly open source.

Polly est une bibliothèque .NET qui fournit des fonctionnalités de résilience et de gestion des erreurs temporaires. Vous pouvez implémenter ces fonctionnalités en appliquant des stratégies Polly telles que Retry, Circuit Breaker, Bulkhead Isolation, Timeout et Fallback. Polly cible .NET Framework 4.x et .NET Standard 1.0, 1.1 et 2.0 (qui prend en charge .NET Core et versions ultérieures).

Les étapes suivantes montrent comment utiliser des nouvelles tentatives Http avec Polly intégrées à IHttpClientFactory, qui est expliquée dans la section précédente.

Installer des packages .NET

Tout d’abord, vous devez installer le Microsoft.Extensions.Http.Polly package.

Référencer les packages .NET 8

IHttpClientFactory est disponible depuis .NET Core 2.1. Toutefois, nous vous recommandons d’utiliser les derniers packages .NET 8 à partir de NuGet dans votre projet. En règle générale, vous devez également référencer le package Microsoft.Extensions.Http.Pollyd’extension.

Configurer un client avec la politique de réessai de Polly, au démarrage de l’application

La méthode AddPolicyHandler() est ce qui ajoute des stratégies aux HttpClient objets que vous utiliserez. Dans ce cas, elle ajoute une stratégie de Polly pour les nouvelles tentatives Http avec backoff exponentiel.

Pour avoir une approche plus modulaire, la stratégie de nouvelle tentative Http peut être définie dans une méthode distincte dans le fichier Program.cs , comme indiqué dans le code suivant :

static IAsyncPolicy<HttpResponseMessage> GetRetryPolicy()
{
    return HttpPolicyExtensions
        .HandleTransientHttpError()
        .OrResult(msg => msg.StatusCode == System.Net.HttpStatusCode.NotFound)
        .WaitAndRetryAsync(6, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2,
                                                                    retryAttempt)));
}

Comme indiqué dans les sections précédentes, vous devez définir une configuration HttpClient de client nommée ou typée dans votre configuration d’application standard Program.cs . Maintenant, vous ajoutez du code supplémentaire spécifiant la stratégie pour les tentatives de réessai Http avec un recul exponentiel, comme suit :

// Program.cs
builder.Services.AddHttpClient<IBasketService, BasketService>()
        .SetHandlerLifetime(TimeSpan.FromMinutes(5))  //Set lifetime to five minutes
        .AddPolicyHandler(GetRetryPolicy());

Avec Polly, vous pouvez définir une stratégie de nouvelle tentative avec le nombre de nouvelles tentatives, la configuration d’interruption exponentielle et les actions à effectuer lorsqu’il existe une exception HTTP, par exemple la journalisation de l’erreur. Dans ce cas, la stratégie est configurée pour essayer six fois avec une nouvelle tentative exponentielle, en commençant à deux secondes.

Ajouter une stratégie d’instabilité à la stratégie de nouvelle tentative

Une stratégie de nouvelle tentative régulière peut affecter votre système en cas de concurrence et d’extensibilité élevée et en cas de contention élevée. Pour surmonter les pics de nouvelles tentatives similaires provenant de nombreux clients en pannes partielles, une bonne solution de contournement consiste à ajouter une stratégie de gigue à l’algorithme/la stratégie de nouvelles tentatives. Cette stratégie peut améliorer les performances globales du système de bout en bout. Comme recommandé dans Polly : Réessayer avec Jitter, une bonne stratégie de gigue peut être implémentée par des intervalles de nouvelle tentative distribués en douceur et uniformément distribués appliqués avec un délai de nouvelle tentative médiane bien contrôlé sur un backoff exponentiel. Cette approche permet de répartir les pics lorsque le problème se produit. Le principe est illustré par l’exemple suivant :


var delay = Backoff.DecorrelatedJitterBackoffV2(medianFirstRetryDelay: TimeSpan.FromSeconds(1), retryCount: 5);

var retryPolicy = Policy
    .Handle<FooException>()
    .WaitAndRetryAsync(delay);

Ressources supplémentaires