Implémenter la résilience des applications

Effectué

Les fonctionnalités de résilience de .NET sont basées sur le projet Polly et mises à disposition via Microsoft.Extensions. Vous pouvez ajouter une stratégie de résilience standard qui utilise des valeurs par défaut sensibles en ajoutant une seule ligne de code à votre application.

Ajouter une résilience à votre application

Pour ajouter la résilience à une application créée à l’aide d’une architecture de microservices, à l’aide de requêtes HTTP entre des services individuels, procédez comme suit :

  1. Ajoutez le package Microsoft.Extensions.Http.Resilience à votre projet.
  2. Ajoutez un gestionnaire de résilience à vos appels de service HttpClient.
  3. Configurez la stratégie de résilience.

Ajouter le package NuGet à votre projet

Exécutez la commande suivante pour ajouter le package NuGet de résilience :

dotnet add package Microsoft.Extensions.Http.Resilience

L’exécution de cette commande à partir du terminal dans le dossier du projet d’applications ajoute la référence du package au fichier projet.

Dans la classe de démarrage de votre application, ajoutez l’instruction using suivante :

using Microsoft.Extensions.Http.Resilience;

Ajouter une stratégie de résilience

Vous pouvez maintenant ajouter une stratégie de résilience standard à votre service HttpClient. .NET fournit cette configuration prête à l’emploi combinant un certain nombre de stratégies.

A diagram showing the strategies included in the Standard Resilience Handler. From overall timeout, retry, bulkhead, circuit breaker, and attempt timeout.

Le gestionnaire de demandes passe par chacune des stratégies ci-dessus dans l’ordre de gauche à droite :

  • Stratégie de délai d’attente total de la requête : Cela définit une durée totale que la requête peut prendre. Vous pouvez considérer cela comme la définition de la limite de temps supérieure pour toutes les autres stratégies.
  • Stratégie de nouvelle tentative : Cette stratégie contrôle les options sur le nombre de nouvelles tentatives, de backoff et d’instabilité. Ces options ne peuvent pas dépasser le délai d’attente total défini dans la stratégie précédente.
  • Stratégie de disjoncteur : Cette stratégie ouvre le circuit si le ratio d’échec dépasse le seuil.
  • Stratégie de délai d’attente de tentative : Cette stratégie définit un délai d’attente pour chaque requête individuelle. Si la requête prend plus de temps que ce délai, une exception est levée.

Vous pouvez ajouter cette stratégie standard, avec toutes les valeurs par défaut en ajoutant cette méthode d’extension :

.AddStandardResilienceHandler();

Par exemple, si vous avez déclaré un WebApplication, et que vous souhaitez ajouter une stratégie de résilience au service HttpClient, utilisez ce code :

builder.Services.AddHttpClient<ServiceBeingCalled>(httpClient =>
{
    httpClient.BaseAddress = new Uri("https://service.endpoint/");
}).AddStandardResilienceHandler();

La première ligne du code ci-dessus ajoute un gestionnaire de résilience standard à HTTPClient. Cela utilise tous les paramètres par défaut pour les stratégies de nouvelle tentative et de disjoncteur.

Configurer la stratégie de résilience

Vous pouvez modifier les valeurs par défaut de l’une des stratégies en spécifiant de nouvelles options, par exemple :

.AddStandardResilienceHandler( options => 
{  
    options.RetryOptions.RetryCount = 10;
    options.RetryOptions.BaseDelay = TimeSpan.FromSeconds(1);
});

Ce code modifie les valeurs par défaut de la stratégie de nouvelle tentative pour avoir un nombre maximal de 10 nouvelles tentatives, pour utiliser un backoff linéaire et un délai de base de 1 seconde.

Les options que vous choisissez doivent être compatibles les unes avec les autres. Par exemple, si le temps total reste à sa valeur par défaut de 30 secondes, les options de nouvelle tentative ci-dessus entraînent une exception. Il s’agit d’une erreur, car le paramètre de backoff exponentiel entraîne un temps total pour terminer les 10 nouvelles tentatives de 2046 secondes. Il s’agit d’une exception à l’exécution, et non d’une erreur au moment de la compilation.

Le tableau suivant répertorie les options disponibles pour chacune des stratégies.

Options de délai d’attente total des requêtes Description
TotalTimeout Durée totale que la requête peut prendre. La valeur par défaut est 30 secondes.
OnTimeout Fonction de rappel appelée lorsque la requête expire. La valeur par défaut est null.

Options de nouvelle tentative Description
RetryCount Nombre maximal de nouvelles tentatives. La valeur par défaut est 3.
BackoffType Type de backoff à utiliser. Vous pouvez choisir entre linéaire et exponentiel. La valeur par défaut est exponentiel.
UseJitter S’il faut ajouter de l’instabilité au backoff. L’instabilité ajoute un caractère aléatoire au délai pour aider à réduire les pics de charge. La valeur par défaut est true.
BaseDelay Le délai entre les tentatives. La valeur par défaut est de 2 secondes.

Options du disjoncteur Description
BreakDuration Durée de coupure du circuit. La valeur par défaut est 5 secondes.
FailureRatio Ratio des requêtes ayant échoué par rapport aux requêtes réussies qui ouvrent le circuit. La valeur par défaut est 0,1.
SamplingDuration Durée pendant laquelle le ratio d’échec est calculé. La valeur par défaut est 30 secondes.
OnClosed Fonction de rappel appelée lorsque le circuit est fermé. La valeur par défaut est null.
OnHalfOpened Fonction de rappel appelée lorsque le circuit est demi-ouvert. La valeur par défaut est null.
OnOpened Fonction de rappel appelée lorsque le circuit est ouvert. La valeur par défaut est null.

Options de délai d’attente de tentative Description
Délai d'expiration Durée que la requête peut prendre. La valeur par défaut est de 2 secondes.
OnTimeout Fonction de rappel appelée lorsque la requête expire. La valeur par défaut est null.

A sequence diagram showing the flow of events in an application using a resiliency strategy.

Le diagramme de séquence ci-dessus montre comment les stratégies fonctionnent les unes avec les autres dans une stratégie de résilience standard. Pour commencer, le facteur de limitation de la durée qu’une requête peut prendre est contrôlé par la stratégie de délai d’attente total. La stratégie de nouvelle tentative doit ensuite être définie pour avoir un nombre maximal de nouvelles tentatives qui se terminent dans le délai d’attente total. La stratégie de disjoncteur ouvre le circuit si le ratio d’échec dépasse le seuil défini pour celui-ci. La stratégie de délai d’attente de tentative définit un délai d’expiration pour chaque requête individuelle. Si la requête prend plus de temps que ce délai, une exception est levée.