【问题标题】:Azure ServiceBus - same message read multiple timesAzure ServiceBus - 多次读取同一消息
【发布时间】:2021-12-17 15:52:43
【问题描述】:

我们在多次读取来自 Azure ServiceBus 的消息时遇到了一些问题。以前我们有同样的问题,结果是由于锁定超时。然后,随着锁超时,消息被再次读取,并且每次读取消息时它们的deliveryCount 增加1。在此之后,我们将最大传递计数设置为 1 以避免重新发送消息,并将锁定超时时间增加到 5 分钟。

当前的问题要奇怪得多。

首先,在 10:45:34 读取消息。消息锁设置为 10:50:34,deliveryCount 为 1。读数显示成功,时间为 10:45:35.0。到目前为止一切顺利。

但是,在 10:45:35.8,再次阅读了相同的消息!而且delivery count还是1。两个receive log中的sequence number和message id都是一样的。这种情况发生在极少数消息中,例如 0.02% 的消息。

据我了解,阅读消息应该会导致成功删除消息,或者增加deliveryCount,在我的情况下应该将消息发送到DLQ。在这些情况下,两者都不会发生。

我正在使用 ServiceBusTrigger,如下所示:

    [FunctionName(nameof(ReceiveMessages))]
    public async Task Run([ServiceBusTrigger(queueName: "%QueueName%", Connection = "ServiceBusConnectionString")]
        string[] messages,

这似乎是服务总线或库中的一个错误,有什么想法吗?

【问题讨论】:

  • 是否为此队列启用了会话?
  • @ThiagoCustodio 我认为没有启用会话。会话是“事务性”读取的先决条件吗?

标签: c# azure azureservicebus azure-webjobs


【解决方案1】:

这不是 SDK,而是特定实体。听起来实体已损坏。删除并重新创建它。如果这没有帮助,请打开支持案例。

另一方面,大多数情况下,交付计数设置为 1 表示出现问题。如果您确实需要at-most-once 交付保证,请使用ReceiveAndDelete 模式而不是PeekLock

【讨论】:

  • 我必须只收到每条消息一次,因为每条消息都代表金钱。而且有很多。这里的问题是它们被读取了两次(很少是 3 次)然后被删除,但是我们在数据库中有重复项。我会实现一些机制来使消息消费幂等,但作为临时修复,我们将传递计数设置为 1,因为重复比在 DLQ 上有消息更糟糕。在我使用过的其他 MQ 中,重复消息将是一个严重的错误。对 Azure 服务总线了解得不够多,但无法说明那里的标准。
  • ASB 不会复制消息。由于未能在 5 分钟内处理,竞争的消费者可能会收到重复。无论哪种方式,我都必须了解并查看您的架构才能提出更具体的建议。如果不是实体,我有一种强烈的感觉,那就是导致问题的过程的设计。魔鬼在细节中?
  • 我很确定我们的设置不是最优的 :p 但是,我似乎无法理解消息消费如何导致除了消息被删除或传递计数之外的任何事情增加了,这似乎是不可能的事情。
猜你喜欢
  • 2017-01-24
  • 2019-06-02
  • 1970-01-01
  • 2015-04-20
  • 1970-01-01
  • 2021-10-08
  • 2019-03-14
  • 2022-01-25
  • 2021-09-08
相关资源
最近更新 更多