Aujourd’hui, la consommation de ressources externes fait partie intégrante de la vie quotidienne des développeurs. L’application que vous développez aura probablement besoin de consommer des données exposées par d’autres ressources.

Leurs disponibilités ne sont pas toujours garanties et peuvent causer des défaillances de votre application. Ainsi, assurer sa résilience devient une nécessité primordiale ! Mais comment rendre votre application résiliente ? Pour répondre à cette problématique, je propose de vous présenter Polly, une bibliothèque à utiliser et à relayer à votre télémétrie.

 

A chaque problème, un pattern

Certains patterns peuvent servir à résoudre ce type de problème et garantir la résilience de votre application.

 

Le pattern Retry

Comme son nom l’indique, le pattern Retry  permet de faire face à l’indisponibilité temporaire de votre ressource en effectuant de nouvelles tentatives. Ces essais peuvent être précédés d’un délai d’attente. L’annulation reste aussi une option possible. Voici un exemple d’implémentation :

 

Exemple d’implémentation du pattern Retry par Microsoft / Source

 

Le pattern Circuit Breaker ou Disjoncteur

Pour certaines ressources et en fonction de certains imprévus, l’indisponibilité peut durer plus longtemps et toute nouvelle tentative est vouée à l’échec. La solution consiste alors à libérer la ressource, d’où le nom de pattern Circuit Breaker. Je vous invite d’ailleurs à consulter cet article sur le Modèle Disjoncteur, pour plus de détails sur le pattern et son processus d’implémentation.

 

Polly, une alternative aux patterns

Si vous avez consulté les liens ci-dessus, vous aurez constaté que l’implémentation de ces patterns s’avère parfois complexe. Il faut aussi rajouter à cela les politiques personnalisées de votre application (le nombre de tentatives, le délai d’attente et d’autres en fonction des APIs).

Grâce à Polly, tous ces détails ne seront plus qu’un mauvais souvenir. Avec trois lignes de code, vous pouvez définir votre politique de Retry ou du Circuit Breaker.

 

Présentation de Polly

Polly is a .NET resilience and transient-fault-handling library that allows developers to express policies such as Retry, Circuit Breaker, Timeout, Bulkhead Isolation, and Fallback in a fluent and thread-safe manner. Polly targets .NET 4.0, .NET 4.5 and .NET Standard 1.1 https://github.com/App-vNext/Polly

Dans l’exemple ci-dessous, Polly permet de remplacer l’implémentation du pattern Retry vu précédemment avec seulement 3 lignes de code :

 

Pour votre application, ces lignes peuvent s’avérer insuffisantes et vous devez gérer cette ressource distante qui ne répond pas. Entre autres, il faudra implémenter une nouvelle policy pour le pattern Circuit Breaker :

 

Dans cet exemple, nous avons donc :

  • Défini une policy circuitBreakerPolicy pour implémenter le Circuit Breaker pattern.
  • Combiné les deux Policies (waitAndRetryPolicy et circuitBreakerPolicy).
  • Inséré notre appel dans un block de try { } catch {} afin de gérer une exception de type BrokenCuicuitException.

Avec ces actions, nous avons protégé notre appel vers une ressource distante. En contrepartie, nous avons ‘re-throw’ l’exception et nous n’avons donc aucune valeur de retour à fournir.

Polly permet, à travers la Fallback Policy, d’y remédier en prévoyant une valeur défaut si cette ressource ne répond plus et sans avoir à utiliser un block try {} catch {}.

 

Comme vous pouvez le constater sur ce code, la méthode ‘FallBackAsync’ prend en paramètre :

  • fallbackAction’ : Une delegate pour retourner la valeur par défaut souhaitée.
  • onFallbackAsync’ : Une action qui sera invoquée avant la delegate. C’est l’emplacement idéal pour logger votre exception.

Dans notre stratégie, nous avons mixer 3 policies :

  1. Un ‘waitAndRetryPolicy‘ pour effectuer de nouvelles tentatives vers la ressource distante.
  2. Un ‘circuitBreakerPolicy‘ si celle-ci ne répond plus même après plusieurs essais.
  3. Un ‘fallbackPolicy‘ pour retourner une valeur par défaut.

Polly permet, grâce à Wrap policy, de combiner ces politiques en les exécutant depuis le plus extérieur vers le plus intérieur.

Ceci n’est qu’un aperçu de ce que cette bibliothèque pourra faire pour vous. Avec un wiki riche, vous pouvez vous inspirer pour gérer le contexte de la Policy, l’exception générée et d’autres actions.

 

Polly et Microsoft

Polly a été créé par Michael Wolfenden. Maintenant elle est supportée par l’équipe App vNext et adoptée par .NET Foundation. On peut donc dire qu’elle est safe et qu’elle a encore de beaux jours devant elle.

Sous .NET Core, Microsoft nous donne accès à toute la documentation nécessaire pour l’utiliser :

 

Cette librairie permet aussi de gérer d’autres politiques de résilience, comme :

 

Conclusion

Quel que soit le type de la ressource à consommer (Une API sur le Cloud ou une base de données distance), votre application doit faire face à de probables défaillances. L’approche recommandée est de tirer profit de Polly. Cette librairie open-source vous aidera à assurer la résilience de vos applications.

Microsoft la recommande et l’utilise pour ses exemples.