Polly政策应该是单身吗?

时间:2017-06-19 19:55:00

标签: c# circuit-breaker polly

我有一个调用外部API的查询# you must pass the function without parenthesis at the end, or else it will # set the default to whatever the value is at server run time. # If you pass the function itself, it will be evaluated every time a # default is needed. Approver = models.ForeignKey(User, default=default_func) 。 我在我的DI容器中注册了IGetHamburgers的实现作为Singleton。我使用Polly作为断路器,如果两个请求失败,电路将打开。

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

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

IGetHamburgers

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

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

1 个答案:

答案 0 :(得分:6)

  

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

正确。这在Polly wiki here中有所描述。简而言之:

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

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

  

第二个选项也会起作用吗?

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