在将策略定义与执行分离时,了解Polly策略的语义

时间:2017-06-09 20:16:25

标签: c# .net polly

使用Polly我希望在两个不同的语句中使用我的策略定义和执行该策略,如:

// Policy definition
var policy = Policy
   .HandleResult<IRestResponse>(predicate)
   .Retry(2);

// Policy execution
policy.ExecuteAndCapture(() =>
{
    DoSomethingAndReturnAnIRestResponse();
};

我想这样做,以便更好地重用我的重试政策,例如:用于依赖注入。

我试图了解在以这种方式分割政策和执行时是否有任何考虑因素,例如,如果有任何&#34;状态&#34; (缺少更好的术语)可能不会将policy对象从策略定义转移到执行中。

在这些方面,我注意到当我以上述方式使用Polly的ExecuteAndCapture()某些属性(与捕获与{{1}相关的最终异常/结果相关的属性时}}没有显示在ExecuteAndCapture()对象上。根据文档(herehere),完成以下政策后:

policy

......你应该回来了:

var policy = Policy
   .HandleResult<IRestResponse>(predicate)
   .Retry(2)
   .ExecuteAndCapture(() =>
    {
       DoSomethingAndReturnAnIRestResponse();
    });

确实发生这种情况,然后PolicyResult.Outcome PolicyResult.FinalException PolicyResult.ExceptionType PolicyResult.Result 与策略定义在同一语句中。但是,在将策略定义与执行分离时,这些属性不可用。我天真地认为他们会出现在现有的ExecuteAndCapture()对象上,但他们不会:

enter image description here

似乎我需要创建一个新的变量赋值才能访问这些属性:

New policy variable with outcome

这里有任何疑虑吗?

1 个答案:

答案 0 :(得分:6)

无顾虑。配置与其使用不同的策略,并将它们注入使用地点,这是我们在生产中广泛使用的常见模式。

所有Polly策略都是线程安全的,可以同时在多个独立的调用站点中使用。

两种Polly策略线程安全地保持内部状态跨越调用,以执行其设计的功能。如果您在呼叫站点之间共享这些策略实例,则会产生特定(预期)效果。

CircuitBreaker / AdvancedCircuitBreaker

存在的理由是根据通过政策发出的呼叫的成功/失败指标来计算和行动。每个单独的策略实例都在内部为自己维护此状态。

这样做的(预期)功能结果是,如果您在多个呼叫站点中共享CircuitBreakerPolicy个实例,那么这些多个呼叫站点将共享电路状态as discussed here

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

Bulkhead

raison-d&#39; etre是限制通过它发出的呼叫的并发性。每个BulkheadPolicy个实例都在内部维护状态以跟踪它。

这样做的(预期)功能结果是,当您在呼叫站点之间共享BulkheadPolicy实例时,这些呼叫站点将共享它们之间的隔板容量。

  • 当您希望呼叫站点共享它们之间的隔板容量时,在多个呼叫站点之间共享相同的BulkheadPolicy实例。
  • 当您希望它们具有独立的隔板容量时,请不要在多个呼叫站点之间共享相同的BulkheadPolicy实例。

没有其他类型的Polly策略在执行过程中维护策略实例中的内部状态。

.ExecuteAndCapture(...)

.ExecuteAndCapture(...)来电的结果不在问题案例的 中的policy。在这两种情况下(在一个语句中定义和执行;或者分开),result of the .ExecuteAndCapture(...) call是一个新的PolicyResult实例。

每次执行都会返回一个新的PolicyResult实例。 PolicyResult永远不会作为状态存储在策略实例上(这会使策略不是线程安全的,并且可以跨调用站点重用)。

var更改为每个代码位置的实际类型(PolicyPolicyResult),这可能更清晰。