Azure Service Bus队列接收方是否有超时限制?

问题描述

我们正在从Azure Service Bus队列接收消息。队列上的接收方(消息处理程序)调用应用程序服务,该服务会更新sql数据库表中的一百万条以上的记录,过程耗时超过30分钟。

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

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

正在发送的实际服务总线消息队列非常小,只有YearProductType。然后,应用服务方法将使用两个参数,并更新整个sql表。

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

解决方法

简短回答:在“偷看”接收模式下,支持的最长锁定持续时间为 5分钟

现在答案很长了:)

有2个modes服务总线消息接收器。

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

对于长时间运行的操作,一种技术是renew the lock的间隔小于锁定持续时间。在下面的示例中,您可以在MessageHandlerOptions中设置MaxAutoRenewDuration属性,该属性可以自动为您续订。

另一种技术可能是利用Message deferral功能,在此功能上,您可以在接收时开始处理,但是要继续推迟消息检索,直到您的处理完成为止,此时您将收到消息并完成。有点复杂,但是很聪明。

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...