9

我有一个IGetHamburgers调用外部 API 的查询。我已将IGetHamburgersDI 容器中的实现注册为单例。我使用 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());
}

或者

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

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

4

1 回答 1

13

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

正确的。在 Polly wiki 中有所描述。简单来说:

  • 当您希望这些呼叫站点共同中断时,跨呼叫站点共享相同的断路器策略实例 - 例如它们具有共同的下游依赖项。
  • 当您希望这些呼叫站点具有独立的电路状态并独立中断时,不要跨呼叫站点共享断路器实例。

请参阅此 stackoverflow 答案,以更广泛地讨论将策略与其使用分开配置、通过 DI 将它们注入使用站点,以及在整个范围内重用相同实例(例如单例)与使用单独实例的效果(2017 年 6 月)Polly 政策。

选项二也可以吗?

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

于 2017-06-19T20:55:27.177 回答