我知道Azure服務總線具有重複的郵件檢測功能,可以移除它認爲是其他郵件重複的郵件。我想使用此功能來防止重複傳送。Azure Service Bus如何識別重複的消息?
我很好奇的是服務如何確定兩個消息實際上是複製:
- 了被認爲是消息的屬性?
- 是否考慮了消息的內容?
- 如果我發送兩封具有相同內容但消息屬性不同的消息,它們是否被認爲是重複的?
我知道Azure服務總線具有重複的郵件檢測功能,可以移除它認爲是其他郵件重複的郵件。我想使用此功能來防止重複傳送。Azure Service Bus如何識別重複的消息?
我很好奇的是服務如何確定兩個消息實際上是複製:
重複檢測查看代理消息的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
但是不同的有效載荷,並且只有一條消息被檢索到。
在我的情況下,我必須申請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);
您有任何可以支持您的答案的參考嗎?我努力尋找具體的東西 - 一個代碼示例就足夠了。 –
當然:我會添加詳細的答案。 – MikeWo
當檢測到重複項時,隊列會保留最舊的消息還是最新的消息? – CodeGrue