问题描述
我们正在从Azure Service Bus队列接收消息。队列上的接收方(消息处理程序)调用应用程序服务,该服务会更新sql数据库表中的一百万条以上的记录,过程耗时超过30分钟。
Azure服务总线队列是否有超时限制?这会导致sql Table进程停止更新行吗?
正在发送的实际服务总线消息队列非常小,只有Year
和ProductType
。然后,应用服务方法将使用两个参数,并更新整个sql表。
Azure服务总线队列方法--->服务总线消息接收(事件处理程序)--->调用App Service更新sql表
解决方法
简短回答:在“偷看”接收模式下,支持的最长锁定持续时间为 5分钟。
现在答案很长了:)
有2个modes服务总线消息接收器。
- 探视锁定模式(非破坏性):如果您在创建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功能,在此功能上,您可以在接收时开始处理,但是要继续推迟消息检索,直到您的处理完成为止,此时您将收到消息并完成。有点复杂,但是很聪明。
- 接收和删除模式(破坏性):在此模式下,顾名思义,该消息在接收时从队列中删除。因此,您可以花很长时间进行处理。但是问题是,万一您的客户端在处理过程中崩溃,您就有可能永远丢失该消息。