Web 作业是否会自动续订 Azure 队列消息上的租约

本文关键字:消息 队列 Azure 是否 作业 Web | 更新日期: 2023-09-27 18:34:43

当 Web 作业通过 QueueTrigger 从 Azure 存储上的队列获取消息时,它会租用该消息(使其不可见(。如果(webjob(触发函数需要很长时间来处理消息,此租约是否会自动延长?还是我应该在函数中处理它?

在此链接 Windows Azure 队列:改进的租约、进度跟踪和未来工作的调度中,作者指出">执行原始取消排队的工作线程可以延长消息的租约,以便它可以继续处理消息">

注意:我尝试了一个等待 20 分钟的网络作业(带有 QueueTrigger(。

//Write Log
Thread.Sleep(1200000);
//Write Log

它已成功完成。在此期间,没有其他 Web 作业实例尝试相同的队列项(它不可见(。因此,似乎存在租约的自动续订机制。无论如何,我正在等待Microsoft员工的答复或官方链接(msdn,azure,...

Web 作业是否会自动续订 Azure 队列消息上的租约

是的,您的租约会自动延长。每次10分钟。

请在此处查看此答案 [1],作者是 Microsoft 员工参考文档和对 azure.microsoft.com 的评论 [2]。

编辑(长答案(

此外,从 https://github.com/Azure/azure-webjobs-sdk/blob/cfc875a7f00e595410c0603e6ca65537025490a9/src/Microsoft.Azure.WebJobs.Host/Queues/Listeners/QueueListener.cs 处的 QueueListener 类开始检查源代码也表明了这一点。

QueueListener 中的代码在第 138 行具有相关部分,其中定义了 10 分钟的 visibilityTimeout 变量:

TimeSpan visibilityTimeout = TimeSpan.FromMinutes(10); // long enough to process the job

然后该变量被传递给ProcessMessageAsync, 以相同的值启动方法CreateUpdateMessageVisibilityTimer中定义的计时器。10 分钟值用于确定第一次和下一次更新可见性超时的时间(通过将其减半并创建 LinearSpeedupStrategy 类的实例(。

最终,在类UpdateQueueMessageVisibilityCommand [3] 中,您会发现队列上的 UpdateMessageAsync 方法以相同的 10 分钟续订进行调用。

LinearSpeedupStrategy将在 5 分钟后再次续订,除非续订失败,在这种情况下,它将在 1 分钟后重试(如 QueueListener 中所定义(。

[1] Azure 存储队列和多个 Web 作业实例:QueueTrigger 是否会在触发时设置消息租用时间?

[2] https://azure.microsoft.com/en-us/documentation/articles/websites-dotnet-webjobs-sdk-get-started/

[3] https://github.com/Azure/azure-webjobs-sdk/blob/cfc875a7f00e595410c0603e6ca65537025490a9/src/Microsoft.Azure.WebJobs.Host/Queues/Listeners/UpdateQueueMessageVisibilityCommand.cs

您可以使用方法(Java 代码(:

queue.retrieveMessage()

从 Azure 存储上的队列获取消息。默认情况下,它将在 30 秒后可见。

如果要延长租约,可以使用以下代码:

CloudQueueMessage updateMessage = queue.retrieveMessage();
EnumSet<MessageUpdateFields> updateFields = EnumSet.of(MessageUpdateFields.CONTENT, MessageUpdateFields.VISIBILITY);
queue.updateMessage(updateMessage, 60, updateFields, null, null);

这意味着您的消息将能够再处理 60 秒。