Implémenter la résilience des applications
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 :
- Ajoutez le
Microsoft.Extensions.Http.Resiliencepackage à votre projet. - Ajoutez un gestionnaire de résilience à vos appels de service HttpClient.
- 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.
Ajoutez ensuite l’instruction using suivante dans la classe de démarrage de votre application :
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.
Le gestionnaire de demandes passe par chacune de ces stratégies dans l'ordre de gauche à droite.
- Stratégie de délai d’expiration de la requête totale : définit un délai total que la demande 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 taux d’échec dépasse le seuil.
- Stratégie de délai d'expiration pour une tentative : cette stratégie définit un délai d’expiration pour chaque requête individuelle. Si la requête prend plus de temps que cette durée, 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 précédent 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 la stratégie de nouvelle tentative par défaut pour avoir un nombre maximal de retraits de 10, pour utiliser une interruption linéaire et utiliser 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 comme valeur par défaut de 30 secondes, les options de nouvelle tentative entraînent une exception. Il s’agit d’une erreur car le paramètre de recul exponentiel ferait que le temps total pour effectuer les 10 nouvelles tentatives serait de 2 046 secondes. Il s’agit d’une exception d’exécution, et non d’une erreur de temps de compilation.
Le tableau suivant répertorie les options disponibles pour chacune des stratégies.
| Options de délai d'expiration global des requêtes | Description |
|---|---|
| Délai d'attente total | La durée totale que la demande peut prendre. La valeur par défaut est de 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 exponentielle. |
| 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 | Délai entre les nouvelles tentatives. La valeur par défaut est de 2 secondes. |
| Options du disjoncteur | Description |
|---|---|
| Durée de la pause | Durée de coupure du circuit. La valeur par défaut est 5 secondes. |
| Taux d'échec | Ratio des demandes ayant échoué aux requêtes réussies qui ouvrent le circuit. La valeur par défaut est 0.1. |
| Durée d'échantillonnage | Durée pendant laquelle le ratio d’échec est calculé. La valeur par défaut est de 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 demande 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. |
Le diagramme de séquence montre comment chacune des stratégies fonctionne ensemble dans une stratégie de résilience standard. Pour commencer, la stratégie de délai d’attente total contrôle le facteur limitant de la durée qu'une requête peut durer. 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 total d’attente. 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 cette durée, une exception est levée.