2017-05-09 41 views
0

我試圖使用ServiceBus訂閱的MaxDeliveryCount來實現消息處理的重試。不確定這是最好的主意,但不想丟失消息。使用MaxDeliveryCount Azure ServiceBus消息進行重新處理

場景:

  1. 有一個主題,與兩個訂戶一個發送(A)和其他 (B)接收消息,使用皮克鎖
  2. 兩個訂閱已經配置MaxDeliveryCount = 10
  3. 兩個客戶機使用 SubscriptionClient.ReceiveBatch(50,TimeSpan.FromMilliseconds(50))到 從隊列
  4. 甲獲得消息發送5個消息,具有有效載荷 「1」, 「2」,... 「5」
  5. 第一消息(「1」)未能在乙處理和其放棄的被標記(BrokeredMessage.Abandon())

    原因:內部原因,應用程序無法處理現在該消息。

    它沒有因爲DeliveryCount < MaxDeliveryCount)

  6. 下一頁BlackLettered,因爲「1」以前失敗的消息時,只有一個消息是 距離要求,並且它預計將信息「1」 SubscriptionClient.ReceiveBatch( 1,TimeSpan.FromMilliseconds(50))
  7. 經過2-3次重複的步驟7,代替接收消息「1」,接收到消息「2」 消息「2」也被標記爲放棄 ,因爲消息「1 「預計
  8. 然後收到消息「3」
    由於消息「1」爲 ,因此消息「3」也被標記爲廢棄

    等等。

看來,在這種情況下,SB以循環方式發送消息。

這是ServiceBus的預期行爲嗎?

我知道SB是否保證有序交付,是否存在一些爭議。對於應用程序來說,按照發送順序處理消息非常重要。

任何想法如何處理消息「2」之前可以執行消息「1」的重新處理,直到DeliveryCount達到MaxDeliveryCount之前?

+0

看來,這種行爲與預取有關! https://docs.microsoft.com/en-us/azure/service-bus-messaging/service-bus-performance-improvements:「如果客戶端啓動接收操作並且緩存中包含消息,則會發送消息從緩存中。「 –

+0

你見過這篇文章:http://stackoverflow.com/questions/28702033/how-to-accomplish-fifo-with-azure-service-bus-topics? – Thomas

+0

有沒有更新?你解決了這個問題嗎? –

回答

0

首先,正如Thomas在他的評論中分享的那樣,您可以嘗試指定SupportOrdering propertytrue作爲主題。

TopicDescription td = new TopicDescription("TopicTest"); 
td.SupportOrdering = true; 

如果訂閱客戶端收到一條消息,並調用Abandon方法放棄上偷看鎖定的消息鎖,我們可以再次調用Receive方法再次得到它,就像這樣。

enter image description here

輸出:

enter image description here

在另一方面,如果可能的話,你可以嘗試一個完整的工作步驟以特定的順序在消息結合起來,而不是在多個消息中拆分步驟,然後您可以在代碼邏輯中按特定順序控制處理,而不是在服務總線基礎結構上回復以提供此保證即

+0

Fred,我會再次檢查supportOrdering選項。我記得我已經設置這是真實的,但問題沒有解決。 –

相關問題