Polly 策略应该是单例吗?

2024-01-03

我有一个疑问,IGetHamburgers,调用外部 API。 我已经注册了实施IGetHamburgers在我的 DI 容器中作为单例。我使用 Polly 作为断路器,如果两个请求失败,电路将打开。

我的目标是对Hamburger api 的所有调用都应该经过同一个断路器,如果 GetHamburgers 失败,那么所有其他调用也应该失败。

我应该如何使用我的保单?我应该将我的政策注册为如下字段:

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());
}

OR

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

我想第一个选项是正确的方法,因为那时策略对象将始终是相同的,并且可以跟踪异常计数和类似的东西。 我的问题是,第二个选项也有效吗?我在 Pollys Github 上找到了很多示例/例子,但我找不到任何“现实世界”的例子,其中 Polly 与 DI 和类似的东西一起使用?


我想第一个选项是正确的方法,因为那时策略对象将始终是相同的,并且可以跟踪异常计数和类似的东西。

正确的。 Polly wiki 中对此进行了描述here https://github.com/App-vNext/Polly/wiki/Some-policy-patterns#re-using-circuit-breaker-instances。简单来说:

  • 当您希望这些调用站点共同中断时,在调用站点之间共享相同的中断策略实例 - 例如它们具有共同的下游依赖项。
  • 当您希望这些调用站点具有独立的电路状态并独立中断时,请勿跨调用站点共享断路器实例。

See 这个 stackoverflow 答案 https://stackoverflow.com/a/44467225更广泛地讨论将策略与其使用分开配置、通过 DI 将它们注入到使用站点,以及在整个范围内重用同一实例(例如单例)与使用单独实例的效果(截至 2017 年 6 月) )Polly 政策。

第二个选项也有效吗?

否(出于相反的原因:每个调用都会创建一个单独的实例,因此不会与其他调用共享电路统计信息/状态)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Polly 策略应该是单例吗? 的相关文章

随机推荐