4 votes

Les politiques de Polly doivent-elles être des singletons ?

J'ai une question à poser, IGetHamburgers qui appelle une API externe. J'ai enregistré l'implémentation de IGetHamburgers dans mon conteneur DI comme un Singleton. J'utilise Polly comme un coupe-circuit, si deux demandes échouent le circuit s'ouvrira.

Mon objectif est que tous les appels à l'api Hamburger passent par le même disjoncteur, si GetHamburgers échoue, tous les autres appels doivent échouer également.

Comment dois-je utiliser ma police ? Dois-je enregistrer ma politique en tant que champ comme ceci :

private Policy _policy;

private Policy Policy
{ 
    get 
    {
        if(this_policy != null)
        {
            return this_policy;
        }

        this._policy = Policy
            .Handle<Exception>()
            .CircuitBreaker(2, TimeSpan.FromMinutes(1));

        return this._policy;
    } 
}

public object Execute(.......)
{
    return Policy.Execute(() => this.hamburgerQuery.GetHamburgers());
}

OU

public object Execute(.......)
{
    var breaker = Policy
            .Handle<Exception>()
            .CircuitBreaker(2, TimeSpan.FromMinutes(1));
    return breaker.Execute(() => this.hamburgerQuery.GetHamburgers());
}

Je pense que la première option est la plus appropriée car l'objet de la politique sera toujours le même et pourra garder la trace du nombre d'exceptions et d'autres choses de ce genre. Ma question est la suivante : l'option numéro deux fonctionnera-t-elle aussi bien ? J'ai trouvé beaucoup d'échantillons/exemples sur Pollys Github mais je n'ai pas trouvé d'exemples du "monde réel" où Polly est utilisé avec DI et des choses comme ça ?

6voto

mountain traveller Points 2126

Je pense que la première option est la bonne, car l'objet de la politique sera toujours le même et pourra garder la trace du nombre d'exceptions et d'autres choses de ce genre.

Correct. Ceci est décrit dans le wiki de Polly aquí . En bref :

  • Partagez la même instance de politique de rupture entre les sites d'appel lorsque vous voulez que ces sites d'appel aient une rupture en commun - par exemple, ils ont une dépendance en aval commune.
  • Ne partagez pas une instance de disjoncteur entre plusieurs sites d'appel lorsque vous voulez que ces sites d'appel aient un état de circuit indépendant et se déclenchent indépendamment.

Voir cette réponse de stackoverflow pour une discussion plus approfondie sur la configuration des politiques séparément de leur utilisation, leur injection dans les sites d'utilisation par DI, et les effets de la réutilisation de la même instance (par exemple un singleton) par rapport à l'utilisation d'instances séparées, sur toute la gamme (en juin 2017) des politiques Polly.

l'option numéro deux fonctionnera-t-elle aussi bien ?

Non (pour la raison inverse : chaque appel crée une instance distincte, et ne partage donc pas les statistiques/états du circuit avec les autres appels).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X