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 分钟超时才有意义。例如:
CancellationToken期间未及时响应因此,只要该函数仍在运行,消息就会在队列中保持隐藏状态。
我做了一个类似的实验来检查:
[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)
| 归档时间: |
|
| 查看次数: |
2664 次 |
| 最近记录: |