Azure 服务总线队列接收器是否有超时限制?

2 .net azure azureservicebus azure-servicebus-queues asp.net-core

我们正在接收来自 Azure 服务总线队列的消息。队列上的接收者(消息处理程序)调用应用程序服务,更新 SQL 数据库表中的百万条记录,处理时间超过 30 分钟。

Azure 服务总线队列是否有超时限制?这会导致 SQL 表进程停止更新行吗?

https://docs.microsoft.com/en-us/azure/service-bus-messaging/service-bus-dotnet-get-started-with-queues

正在发送的实际服务总线消息队列非常小,它只是一个YearProductType。然后app service方法会带上这两个参数,更新整个sql表。

Azure 服务总线队列方法 ---> 服务总线消息接收(事件处理程序)---> 调用应用服务更新 SQL 表

kri*_*shg 5

简短回答:在 Peek-Lock 接收模式下,支持的最大锁定持续时间为5 分钟

现在是长答案:)

服务总线消息接收器有 2 种模式

  1. Peek-Lock 模式(非破坏性):如果您在创建 QueueClient 时未指定,则这是默认设置(构造函数具有接受 ReceiveMode 的重载)。在此模式下,接收锁定/隐藏客户端的消息一段时间(称为锁定持续时间),这是队列的设置(您可以在 Azure 门户中查看)。支持的最大值为5 分钟。如果到那时您的处理还没有完成并且您没有完成消息 (CompleteAsync),则锁定会过期并且消息重新出现在队列中。有关更多详细信息,请参阅https://docs.microsoft.com/en-us/azure/service-bus-messaging/message-transfers-locks-settlement#peeklock

对于长时间运行的操作,一种技术是以比锁持续时间更短的间隔更新锁。在您下面的示例中,您可以在 MessageHandlerOptions 中设置 MaxAutoRenewDuration 属性,它可以为您自动续订。

另一种技术可能是利用消息延迟功能,您在接收时开始处理,但继续延迟消息检索,直到您的过程完成,此时您收到消息并完成。有点复杂,但很聪明。

  1. 接收和删除模式(破坏性):在此模式下,顾名思义,在接收时将消息从队列中删除。因此,您可以花尽可能长的时间进行处理。但问题是,如果您的客户端在处理过程中崩溃,您可能会永远丢失消息。