Azure 函数可见性超时

msl*_*lot 7 azure azure-storage-queues azure-functions

当我阅读有关可见性超时的文档时:https : //docs.microsoft.com/en-us/azure/azure-functions/functions-bindings-storage-queue#host-json它说“处理消息失败。”。我的理解是,如果超时设置为 30 秒并且我的函数运行了 1 分钟但在这 1 分钟内没有失败,则队列中的其他人看不到该消息。但是当我通过其他来源(stackoverflow fx)阅读它时,它告诉我相反的情况,当函数的执行时间超过超时时,即使函数仍在处理消息,消息也会变得可见。

真相是什么?超时仅在函数没有运行更多(并且可能已经失败)时才相关,或者即使函数仍在运行,消息是否会再次可见?

如果我们假设消息在达到超时时可见,那么没有意义的是默认超时为 00:00:00,这意味着消息在出队的同时可见。这与 3. 党内消息来源的说法相矛盾。

我对此有点困惑。

Sam*_*hke 19

看来这里实际上使用了两种不同的可见性超时值。两者均由 Azure WebJobs SDK 设置,但只有一项是可配置的。

当功能失效时

配置选项queues.visibilityTimeout的名称可能更恰当retryDelay

当函数引发异常或因其他类型的错误而失败时,消息将返回到队列以进行重试。该消息随配置一起返回visibilityTimeout(请参阅此处),这会延迟函数下次尝试运行的时间。

这使您的应用程序能够应对瞬态错误。例如,如果电子邮件 API 或其他外部服务暂时关闭。通过延迟重试,服务有可能重新联机以进行下一次功能尝试。

maxDequeueCount在将消息移至Poison Queue之前,重试次数仅限于尝试次数(默认为 5 次) 。

当函数运行时

当绑定运行该函数时,它会以 10 分钟的可见性超时(此处QueueTrigger硬编码)使消息出队。然后,只要函数正在运行,它就会设置一个计时器,以在达到一半时间时延长可见性窗口(请参阅源代码中的计时器可见性更新)。

通常你不需要担心这个,只要你的函数CancellationToken正确使用 s 即可。仅当 Azure Function/WebJob 主机无法正常关闭时,此 10 分钟超时才有意义。例如:

因此,只要该函数仍在运行,消息就会在队列中保持隐藏状态。

确认

我做了一个类似的实验来检查:

[FunctionName("SlowJob")]
public async Task Run(
    [QueueTrigger("slow-job-queue")] CloudQueueMessage message,
    ILogger log)
{
    for (var i = 0; i < 20; i++)
    {
        log.LogInformation($"Next visible {i}: {message.NextVisibleTime}");
        await Task.Delay(60000);
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

Next visible 0: 5/11/2020 7:49:24 +00:00
Next visible 1: 5/11/2020 7:49:24 +00:00
Next visible 2: 5/11/2020 7:49:24 +00:00
Next visible 3: 5/11/2020 7:49:24 +00:00
Next visible 4: 5/11/2020 7:49:24 +00:00
Next visible 5: 5/11/2020 7:54:24 +00:00
Next visible 6: 5/11/2020 7:54:24 +00:00
Next visible 7: 5/11/2020 7:54:24 +00:00
Next visible 8: 5/11/2020 7:54:24 +00:00
Next visible 9: 5/11/2020 7:54:24 +00:00
Next visible 10: 5/11/2020 7:59:24 +00:00
Next visible 11: 5/11/2020 7:59:24 +00:00
...
Run Code Online (Sandbox Code Playgroud)