【问题标题】:Detect identical unhandled messages in Azure Service Bus Queue在 Azure 服务总线队列中检测相同的未处理消息
【发布时间】:2020-04-23 09:08:30
【问题描述】:

我们正在构建一个系统,为所有客户预先计算所有价格。根据我们 ERP 中的某些触发因素(例如价目表更改),我们会将所有受影响的客户编号放入一个队列中,监听该队列的 Azure 函数将重新计算该特定客户的价格。

示例:对价目表进行了更改,并且用户单击了保存。 3000 名客户受到此更改的影响并被添加到计算队列中。如果计算需要两秒钟,我们可以并行进行 10 次计算,最后一个客户的价格将在 3000*2/10=600 秒后完成。当客户编号在队列中等待时,用户进行另一项更改并单击保存。在这种情况下,我们希望排除添加队列中已经存在的所有客户编号。

问题:Azure 服务总线队列具有重复检测功能,但这是基于时间的。如果队列中已经有另一条具有相同内容的消息,是否有其他方法可以避免将消息添加到队列中?

注意:所有其他资源都在 Azure 中,因此我们只关注基于 Azure 的队列和事件解决方案。

【问题讨论】:

    标签: azure azure-servicebus-queues azure-eventgrid


    【解决方案1】:

    Azure 服务总线队列具有重复检测功能,但这是基于时间的。如果队列中已经有另一条具有相同内容的消息,是否有其他方法可以避免将消息添加到队列中?

    重复检测基于一段时间内的消息 ID。如果您想要基于内容的重复数据删除,则需要将消息 ID 转换为内容哈希。这样,相同的内容将生成相同的消息 ID,随后的消息将被丢弃。我已经在我的post 中详细描述了这个想法。

    更新

    从评论到答案:

    这是否仅适用于队列中已删除的内容?如果我的消息在 5 分钟前被处理,我肯定想重新运行它。但如果我的消息仍在队列中,我不想再添加它。

    这不是重复数据删除的工作方式。它不关心消息是否在队列中,它查看消息 ID 并检查是否在重复数据删除时间窗口内处理了具有相同 ID 的消息。如果答案是“是”,则该消息将被视为重复并被丢弃。否则,消息将被处理。如果使用该 ID 的最后一条消息的时间窗口已过,则该消息不被视为重复,将被处理。

    也许您需要的不是直接从队列中处理。相反,使用队列将工作项发送到数据存储并定期查询数据存储以执行工作项。这样,如果重复消息到达队列,而数据存储中仍有相同的工作项,则该消息将被丢弃并且不会写入数据存储。否则,将消息写入数据存储,并定期查询数据存储以执行工作项。

    【讨论】:

    • 这是否仅适用于队列中已删除的内容?如果我的消息在 5 分钟前被处理,我肯定想重新运行它。但如果我的消息仍在队列中,我不想再次添加它。
    • 消息重复数据删除在预定义的时间窗口内工作。如果您将窗口定义为 5 分钟,则在 5 分钟后到达的具有相同消息 ID 的任何内容都不会被视为重复,而 将被处理。根据您提供的评论,您的要求与技术的用途不匹配。我会更新我的答案以反映它。
    猜你喜欢
    • 2017-11-01
    • 2019-07-23
    • 2012-08-28
    • 2020-01-31
    • 1970-01-01
    • 1970-01-01
    • 2014-11-03
    • 1970-01-01
    相关资源
    最近更新 更多