3

我很難理解與QueueClients一起使用的RetryExponential類(並且我也假設SubscriptionClients)。ServiceBus重試指定的屬性含義

該屬性列出here,但我不認爲我的解釋他們的描述是正確的。

這裏是我的解釋......

var minBackoff = TimeSpan.FromMinutes(5); // wait 5 minutes for the first attempt? 
    var maxBackoff = TimeSpan.FromMinutes(15); // all attempts must be done within 15 mins? 
    var deltaBackoff = TimeSpan.FromSeconds(30); // the time between each attempt? 
    var terminationTimeBuffer = TimeSpan.FromSeconds(90); // the length of time each attempt is permitted to take? 
    var retryPolicy = new RetryExponential(minBackoff, maxBackoff, deltaBackoff, terminationTimeBuffer, 10); 

我工作者的角色只是試圖在即使我認爲基於配置過去一小時內處理掉隊列中的消息的兩倍以上,應該更頻繁地熄滅(每30秒+在先前嘗試達90秒期間使用的任何處理時間)。我認爲這些設置會每2分鐘強制一次重試。但是,我不明白這個解釋是如何根據指數的。

我的解釋是否對每個房產(在上面的評論中)是正確的?如果不是(我認爲他們不正確),每個屬性意味着什麼?

回答

7

如您所懷疑的,您包含的值對於這些參數的含義沒有意義。以下是我對這些參數的理解:

  • DeltaBackoff - 用於按指數增加重試間隔的間隔。
  • MaximumBackoff - 您希望重試之間的最大次數。
  • MaxRetryCount - 系統重試操作的最長時間。
  • MinimalBackoff - 重試之間所需的最短時間。
  • TerminationTimeBuffer - 系統在放棄前重試操作的最長時間。

它總是會重試到maxRetryCount,在你的情況10中,除非terminateTimeBuffer限制先被命中。

它也不會嘗試超過終止時間緩衝區,在您的情況下是90秒,無論它還沒有達到最大重試次數。

minBackoff是您在重試之間等待的最少時間,maxBackoff是您希望在重試之間等待的最長時間。

DeltaBackOff值是每個重試內部按指數增長的值。請注意,這不是確切的時間。它會隨機選擇一個比這次少一點或多一點的時間,以便多個線程全部重試都不會在同一時間完成。它的隨機性使這一點錯開了。在第一次實際嘗試和第一次重試之間,只有minBackOff間隔。由於您將deltaBackOff設置爲30秒,因此如果再次嘗試,則大約需要30秒加上minBackOff。第三次重試將是90秒加上minBackOff,以此類推,直到它達到最大回退。

我要確保指出的一件事是,這是一個重試策略,意味着如果操作收到異常,它將遵循此策略再次嘗試。如果Retrieve,Deadletter,Defer等操作失敗,那麼這個重試策略就會啓動。這些是針對服務總線的操作,而不是您自己處理中的異常。

我可能錯了,但我的理解是,這並不直接關係到實際收到的消息進行處理,除非接收的呼叫失敗。連續處理通過Receive方法和您自己的代碼循環來處理,或者通過使用OnMessage操作(後臺也使用Receive)來處理。只要沒有錯誤實際嘗試接收,則此重試策略不會得到應用。在接收調用之間使用的時間間隔由您自己使用接收方法(需要一個時間範圍)或者在創建queueClient對象之前設置MessagingFactory.OperationTimeout來設置。如果接收呼叫達到了等待的限制,則可能是因爲您使用了在接收時提供時間範圍的重載,或者它達到了默認值,則返回空值。這不被視爲例外,因此重試策略不會生效。

不幸的是,我認爲您必須爲實際處理編寫自己的指數函數。雖然有很多例子。

是的,您可以在QueueClient和SubscriptionClient上都設置此重試策略。

+1

邁克你斷言接收不參加重試是正確的。接收操作將返回null或消息,然後需要再次調用以接收下一條消息。重試策略用於處理錯誤並重試這些操作,例如完成消息,發送消息或創建隊列等。 –

+0

@MikeWo每個文檔和人員都會談論MaximumBackoff,但是它的價值是什麼?你知道價值嗎? –

+0

@NuriYILMAZ MaximumBackoff是一個時間跨度。默認情況下,服務總線的重試策略由RetryPolicy.Default設置,它使用30秒的MaximumBackoff。如果您將其設置爲其他內容,則希望使用在檢查隊列進行工作時願意等待的時間最長的值。 – MikeWo