我了解Azure Service Bus具有重复的邮件检测功能,该功能将删除它认为与其他邮件重复的邮件。我想使用此功能来帮助防止一些重复传递。
我很好奇的是服务如何确定两条消息实际上是重复的:
答案 0 :(得分:30)
重复检测正在查看代理消息的MessageId
属性。因此,如果您将消息Id设置为每个消息应该是唯一的,重复检测可以捕获它。据我所知,只有消息Id用于检测。不会查看邮件的内容,因此如果您发送了两条具有相同实际内容但具有不同邮件ID的邮件,则不会将其检测为重复邮件。
参考文献:
MSDN文档:http://msdn.microsoft.com/en-us/library/windowsazure/hh367516.aspx
如果方案不能容忍重复处理,那么另外 应用程序中需要逻辑来检测可能的重复项 基于消息的MessageId属性实现 在交付尝试中保持不变。这被称为完全 一旦处理完毕。
在WindowsAzure.com上还有一个Brokered Message Duplication Detection code sample,除了证明这一点之外,它应该是您正在寻找的。 p>
我也快速对此进行了测试,并将5封邮件发送到RequiresDuplicateDetection
设置为true的队列,所有内容都具有完全相同的内容但不同MessageIds
。然后我检索了所有五条消息。然后我做了反向,我匹配MessageIds
但有效负载不同,只检索了一条消息。
答案 1 :(得分:1)
在我的情况下,我必须在 MessageId 之上应用 ScheduledEnqueueTimeUtc 。 因为在子序列重复消息到达队列之前,大多数时间第一条消息已经被工作人员拾取。 添加 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);
答案 2 :(得分:0)
处理Azure Service Bus实体的' RequiresDuplicateDetection '属性时要考虑的另一个重要属性是' DuplicateDetectionHistoryTimeWindow ',这是带有重复消息的消息的时间范围id将被拒绝。
重复检测时间历史记录的默认值现在为30秒,范围可以在20秒到7天之间。
启用重复检测有助于跟踪在指定时间段内发送到队列或主题中的所有消息的应用程序控制的MessageId。如果发送的任何新消息都带有在时间窗口内已记录的MessageId,则该消息将被报告为已接受(发送操作成功),但是新发送的消息将立即被忽略并丢弃。除了MessageId之外,不考虑消息的其他部分。