【问题标题】:Getting duplicate messages from Azure Storage Queue从 Azure 存储队列获取重复消息
【发布时间】:2020-12-12 19:22:31
【问题描述】:

我收到来自 Azure 存储队列的重复消息。我确信我的函数只执行一次,因为我在同一函数中将消息记录在数据库中。点击按钮后,我看到,消息在存储队列中排队,并在一秒钟内出队(同样,这不是有 2 条相同的消息入队)。

对此有什么想法吗?提前致谢!

P.S - 请注意,它不是 Azure 服务总线,我可以将属性 RequiresDuplicateDetection 设置为 True 来解决此问题。

【问题讨论】:

    标签: azure azure-storage azure-storage-queues


    【解决方案1】:

    目前,Azure 存储队列不支持重复检测。

    没有机制可以查询存储队列并找出具有相同内容的消息是否已经存在或以前存在。您可以尝试使用一些存储表来实现自己的逻辑,但这并不可靠——因为进入表可能会成功,然后进入队列可能会失败——现在你可能会在表中有错误的数据。

    您的代码应始终假定它可以检索包含已处理的相同数据的消息。这是因为当处理消息的工作人员崩溃或耗时过长时,消息可能会返回队列。

    由于存储队列不支持重复检测,您可以给voice反馈。

    更多详情可以参考这个article

    【讨论】:

    • 感谢乔伊的回复。我知道 Azure 存储中没有重复检测。我想知道的是人们如何防止从 Azure 存储发送重复消息(可能是通过代码或其他方式),或者有什么可能的方法来确定工作人员崩溃并导致他们重新发送消息的原因?
    • 您可以将消息发送到列表中,并且每次发送消息之前,将消息与列表进行比较。
    • 有很多可能的原因导致崩溃和重新发送消息。例如,当您发送大消息并超时时。如果不想重发消息,可以将maxDequeueCount设置为0。
    【解决方案2】:

    您可以将消息发送到队列,当从队列中读取消息时,您可以将其删除,这样就不会再重复了,但这将在 Azure Functions 的服务器端完成。从客户端你将面临太多的并发问题。如果您不想删除,那么 dequeue 属性的使用也是正确的方法。

    https://docs.microsoft.com/en-us/azure/storage/queues/storage-dotnet-how-to-use-queues?tabs=dotnet#de-queue-the-next-message

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-12
      • 2014-01-28
      • 1970-01-01
      • 2019-04-18
      • 1970-01-01
      • 2019-03-14
      • 1970-01-01
      • 2021-06-21
      相关资源
      最近更新 更多