[英]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
更改為每個代碼位置中的實際類型( Policy
或PolicyResult
),這可能更清楚。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.