Polly策略应该是单例吗?

10

我有一个查询IGetHamburgers,它调用外部API。 我已将IGetHamburgers的实现注册为我的DI容器中的Singleton。我正在使用Polly作为断路器,如果两个请求失败,则电路将打开。

我的目标是所有对汉堡包api的调用都应通过同一断路器进行,如果GetHamburgers失败,则所有其他调用也应失败。

我该如何使用我的策略?我应该像这样将我的策略注册为字段吗:

```html

我有一个查询IGetHamburgers,它调用外部API。 我已将IGetHamburgers的实现注册为我的DI容器中的Singleton。我正在使用Polly作为断路器,如果两个请求失败,则电路将打开。

我的目标是所有对汉堡包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对象将始终相同,并且可以跟踪异常计数等信息。 我的问题是,第二个选项也能行吗?我在Polly的Github上找到了很多样本/示例,但我找不到任何与DI之类的东西一起使用Polly的"现实世界"示例。

1个回答

14
我认为第一种选项是正确的方式,因为这样策略对象将始终相同,并且可以跟踪异常计数等信息。
正确。 这在Polly wiki here中有描述。简而言之:
- 当您希望这些调用站点共同中断(例如,它们具有共同的下游依赖项)时,请在调用站点之间共享相同的断路器策略实例。 - 当您希望这些调用站点具有独立的电路状态并独立中断时,请勿在调用站点之间共享断路器实例。
请参见this stackoverflow answer,以获取有关单独配置策略及其使用、通过DI将其注入使用站点以及重复使用相同实例(例如单例)与使用不同实例的影响的更全面讨论(截至2017年6月),适用于Polly策略的所有范围。
第二个选项也能行吗?
不行(原因相反:每次调用都会创建一个单独的实例,因此不会与其他调用共享电路统计/状态)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接