簡體   English   中英

在將策略定義與執行分離時,了解Polly策略的語義

[英]Understanding the semantics of Polly policies when separating policy definition from execution

對於Polly,我想將我的策略定義和該策略的執行分為兩個不同的語句,如:

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

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

我想這樣做,所以我可以更好地重用我的重試策略,例如用於依賴注入。

我試圖了解在以這種方式拆分策略和執行時是否有任何考慮因素,例如,如果存在任何可能未從策略定義到policy對象的“狀態”(缺少更好的術語)執行。

沿着這些方向,我注意到當我以上述方式使用Polly的ExecuteAndCapture()時,某些屬性(與捕獲與ExecuteAndCapture()相關聯的最終異常/結果相關的屬性)未顯示在policy對象上。 根據文檔( 此處此處 ),完成以下政策后:

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

......你應該回來:

PolicyResult.Outcome
PolicyResult.FinalException
PolicyResult.ExceptionType
PolicyResult.Result

這確實發生,然后ExecuteAndCapture()與策略定義在同一語句中。 但是,在將策略定義與執行分離時,這些屬性不可用。 我天真地認為他們會出現在現有的policy對象上,但他們沒有:

在此輸入圖像描述

看來我需要創建一個新的變量賦值才能訪問這些屬性:

帶有結果的新政策變量

有什么顧慮嗎?

沒關系。 配置與其使用分開的策略,並將它們注入使用的站點,這是我們在生產中廣泛使用的常見模式。

所有Polly策略都是線程安全的,可以同時跨多個獨立的調用站點使用。


兩種Polly策略線程安全地保持內部狀態跨越調用,以執行其設計的功能。 如果您跨呼叫站點共享這些策略實例,則會導致特定(預期)效果。

CircuitBreaker / AdvancedCircuitBreaker

存在的理由是根據通過政策發出的呼叫的成功/失敗指標來計算和行動。 每個單個策略實例都在內部為自己維護此狀態。

這樣的(預期)功能結果是,如果您在多個呼叫站點中共享CircuitBreakerPolicy實例,那么這些多個呼叫站點將共享電路狀態, 如此處所述

  • 當您希望這些呼叫站點共同中斷時,在呼叫站點之間共享相同的斷路器策略實例 - 例如,它們具有共同的下游依賴關系。
  • 當您希望這些呼叫站點具有獨立的電路狀態並獨立中斷時,不要在呼叫站點之間共享斷路器實例。

Bulkhead

存在的理由是限制通過它進行的呼叫的並發性。 每個單獨的BulkheadPolicy實例都在內部維護狀態以跟蹤它。

這樣做的(預期)功能結果是,當您在呼叫站點之間共享BulkheadPolicy實例時,這些呼叫站點將共享它們之間的隔板容量。

  • 如果希望呼叫站點共享它們之間的隔板容量,請在多個呼叫站點之間共享相同的BulkheadPolicy實例。
  • 如果希望它們具有獨立的隔板容量,請不要在多個呼叫站點之間共享同一個BulkheadPolicy實例。

沒有其他類型的Polly策略在執行期間維護策略實例中的內部狀態。


.ExecuteAndCapture(...)

在問題的任何一種情況下, .ExecuteAndCapture(...)調用的結果都不在policy中。 在這兩種情況下(在一個語句中定義和執行;或者分開) PolicyResult .ExecuteAndCapture(...)調用的結果是一個新的PolicyResult實例。

每次執行都會返回一個新的PolicyResult實例。 PolicyResult永遠不會作為狀態存儲在策略實例上(這會使策略不是線程安全的,並且可以跨調用站點重用)。

var更改為每個代碼位置中的實際類型( PolicyPolicyResult ),這可能更清楚。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM