2013-11-15 23 views
16

我知道Azure服務總線具有重複的郵件檢測功能,可以移除它認爲是其他郵件重複的郵件。我想使用此功能來防止重複傳送。Azure Service Bus如何識別重複的消息?

我很好奇的是服務如何確定兩個消息實際上是複製:

  • 了被認爲是消息的屬性?
  • 是否考慮了消息的內容?
  • 如果我發送兩封具有相同內容但消息屬性不同的消息,它們是否被認爲是重複的?

回答

27

重複檢測查看代理消息的MessageId屬性。因此,如果您將消息Id設置爲每條消息中應該唯一的東西,則重複檢測可以捕獲它。據我所知,只有消息Id用於檢測。消息的內容不會被查看,所以如果您發送的兩條消息具有相同的實際內容,但具有不同的消息ID,則不會將其檢測爲重複。

參考文獻:

MSDN文檔:http://msdn.microsoft.com/en-us/library/windowsazure/hh367516.aspx

如果方案不能耐受重複的處理,然後附加 邏輯需要在應用程序中檢測是否有重複其可以是 取得了基於所述的MessageId屬性的郵件,其中 保持不變的投遞嘗試。這就是所謂的正確 一旦處理。

在WindowsAzure.com上還有一個Brokered Message Duplication Detection code sample,它應該與您正在尋找的內容一致。

我也快速測試了這一點,併發送了5條消息到一個隊列RequiresDuplicateDetection設置爲true,所有內容完全相同但不同MessageIds。然後我檢索了全部五條消息。然後我做了相反的匹配MessageIds但是不同的有效載荷,並且只有一條消息被檢索到。

+1

您有任何可以支持您的答案的參考嗎?我努力尋找具體的東西 - 一個代碼示例就足夠了。 –

+1

當然:我會添加詳細的答案。 – MikeWo

+0

當檢測到重複項時,隊列會保留最舊的消息還是最新的消息? – CodeGrue

0

在我的情況下,我必須申請ScheduledEnqueueTimeUtc頂部的消息Id。 因爲大部分時間第一條消息已經被工作人員取走,所以在子序列重複消息到達隊列之前。 通過添加ScheduledEnqueueTimeUtc。我們告訴服務總線在讓他們工作之前先保留一段時間。

  var message = new BrokeredMessage(json) 
      { 
       MessageId = GetMessageId(input, extra) 
      }; 

      // Delay 30 seconds for Message to process 
      // So that Duplication Detection Engine has enought time to reject duplicated message 
      message.ScheduledEnqueueTimeUtc = DateTime.UtcNow.AddSeconds(30);