Windows Azure 服务总线队列重复检测如何工作?

Posted

技术标签:

【中文标题】Windows Azure 服务总线队列重复检测如何工作?【英文标题】:How does Windows Azure Service Bus Queues Duplicate Detection work? 【发布时间】:2013-05-27 05:37:07 【问题描述】:

我知道您可以将重复检测设置为使用 azure 服务总线队列在一段时间内工作。但是,有谁知道这是否基于队列中的对象有效?

所以,如果我有一个 id 为“SO_1”的对象被放入队列并随后被消费,那么重复检测是否仍然有效?

我想我要问的是 - 是时间框架和对象,还是只是让队列决定什么是重复的时间框架?

【问题讨论】:

【参考方案1】:

http://blog.iquestgroup.com/en/windows-azure-service-bus-duplicate-detection/#.UaiXrd7frIU

当我们激活复制时,Windows Azure 服务总线将开始存储我们的消息历史记录。这段时间可以配置为从几分钟到几天不等。如果重复的消息被发送到服务总线,服务将自动忽略该消息。

【讨论】:

好东西,谢谢 - 最后一篇文章很有帮助,但它仍然没有说明重复检测是否在决定是否转储项目之前检查项目是否真的在队列中.我猜不是 - 它只是保留重复列表并检查它们并忽略队列的内容。在找到明确的答案之前,我会一直保持这个问题。 the Windows Azure Service Bus will start to store a history of our messages. This period of time can be configured to range from only a few minutes to days.很清楚 重复数据删除不关心当前队列中的内容。 A) 如果 MessageId 1 在时间范围内通过,相同的 MessageId 将不会再次入队。 B) 如果 MessageId 1 很久以前就已入队,但在时间范围内未出队,则第二个 MessageId 1 再次入队(即重复)。【参考方案2】:

发布此内容是为了澄清上述回复中的一些误解,

    启用重复检测有助于跟踪在指定时间窗口内发送到队列或主题的所有消息的应用程序控制的 MessageId。如果在时间窗口内发送任何带有已经记录的 MessageId 的新消息,则该消息被报告为已接受(发送操作成功),但新发送的消息会立即被忽略并丢弃。除了 MessageId 之外,不考虑消息的其他部分。 (其中一个回复中引用的博客说消息内容不能重复,这是不正确的)。

    现在重复检测时间历史的默认值为30秒,该值可以在20秒到7天之间。

更多详情请参考this documentation。

【讨论】:

现在似乎默认值是 10 分钟。【参考方案3】:

这其实只是咬我,默认好像是启用它,默认时间是10分钟。 “关键”是 MessageId。在我们的案例中,在大多数情况下重复检测都很好,但在某些情况下这是个坏消息(尤其是在 10 分钟范围内)。为了解决这个问题,我们引入了一个“断路器”:

// For this message, we need to prevent dups from being detected
msg.MessageId = messageId + "_" + DateTime.Now.ToString("u");

如果您只是想防止“垃圾邮件”,您可以考虑将重复检测窗口设置为最小值(20 秒)。 (就我个人而言,我希望看到一个低至 5 秒的阈值)。

当前允许的范围是 20 秒到 7 天。

【讨论】:

FWIW - 在高性能情况下,“u”格式仅包含秒数。我刚刚修复了一个不够精细的错误。我的解决方法是改用: DateTime.Now.ToString("yyyy-M-ddThh:mm:ss.ff") 。这与 "u" 相同,但在 1/100 上增加了亚秒。

以上是关于Windows Azure 服务总线队列重复检测如何工作?的主要内容,如果未能解决你的问题,请参考以下文章

Azure 服务总线队列以并行方式异步处理消息

Azure 服务总线向队列中添加消息的速度过快

如何在节点js中向azure服务总线队列发送消息时将内容类型指定为application/json?

从死信队列重新提交消息 - Azure 服务总线

使用订阅的 Azure 服务总线队列

顺序处理算法/模式 - Azure 服务总线队列