Polly Policies 应该是单例吗?
Should Polly Policies be singletons?
我有一个查询 IGetHamburgers
,它调用外部 API。
我已经在我的 DI 容器中将 IGetHamburgers
的实现注册为 Singleton。我使用 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());
}
我想第一个选项是正确的方法,因为从那时起策略对象将始终相同并且可以跟踪异常计数和类似的东西。
我的问题是,第二个选项是否也有效?我在 Pollys Github 上找到了很多 samples/examples 但我找不到任何 "real world" 将 Polly 与 DI 和类似的东西一起使用的例子?
I guess that the first option is the correct way since then the Policy object will always be the same and can keep track of the exception count and stuff like that.
正确。这在 Polly wiki here 中有描述。简而言之:
- 当您希望这些调用点共同中断时,跨调用点共享相同的断路器策略实例 - 例如,它们具有共同的下游依赖性。
- 当您希望调用站点具有独立的电路状态并独立中断时,请不要跨调用站点共享断路器实例。
请参阅 以更广泛地讨论如何将策略与其使用分开配置、通过 DI 将它们注入使用站点,以及重用同一实例(例如单例)与使用独立实例,涵盖整个 Polly 策略范围(截至 2017 年 6 月)。
will option number two work as well?
否(相反的原因:每次调用都会创建一个单独的实例,因此不会与其他调用共享电路 statistics/states)。
我有一个查询 IGetHamburgers
,它调用外部 API。
我已经在我的 DI 容器中将 IGetHamburgers
的实现注册为 Singleton。我使用 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());
}
我想第一个选项是正确的方法,因为从那时起策略对象将始终相同并且可以跟踪异常计数和类似的东西。 我的问题是,第二个选项是否也有效?我在 Pollys Github 上找到了很多 samples/examples 但我找不到任何 "real world" 将 Polly 与 DI 和类似的东西一起使用的例子?
I guess that the first option is the correct way since then the Policy object will always be the same and can keep track of the exception count and stuff like that.
正确。这在 Polly wiki here 中有描述。简而言之:
- 当您希望这些调用点共同中断时,跨调用点共享相同的断路器策略实例 - 例如,它们具有共同的下游依赖性。
- 当您希望调用站点具有独立的电路状态并独立中断时,请不要跨调用站点共享断路器实例。
请参阅
will option number two work as well?
否(相反的原因:每次调用都会创建一个单独的实例,因此不会与其他调用共享电路 statistics/states)。