当我阅读有关visibilityTimeout的文档:https://docs.microsoft.com/en-us/azure/azure-functions/functions-bindings-storage-queue#host-json时,它说“处理消息失败时重试之间的时间间隔。”。我如何理解这一点,如果超时设置为30秒并且我的函数运行1分钟但在1分钟内没有失败,则队列中的其他人不会看到该消息。但是当我通过其他来源(stackoverflow fx)读取它时,它告诉我相反的情况,当函数的执行时间超过超时时,消息变为可见,即使该函数仍在处理消息。
真相是什么?当函数没有运行更多(并且可能已经失败)时,超时是否仅相关,或者即使函数仍在运行,消息是否会再次可见?
如果我们假设在达到超时时消息可见,则默认超时为00:00:00,这意味着消息在出列的同一时刻是可见的,这也是没有意义的。这与党的消息来源所说的相矛盾。
我有点困惑。
我测试了这个
using System;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Host;
using Microsoft.Extensions.Logging;
using Microsoft.WindowsAzure.Storage.Queue;
namespace WorkerFunctions
{
public static class WorkerFunctions
{
[FunctionName("WorkerFunction1")]
public static async Task Function1(
[QueueTrigger("outputQueue")]
CloudQueueMessage item,
[Queue("outputQueue")]
CloudQueue outputQueue,
DateTimeOffset nextVisibleTime,
DateTimeOffset expirationTime,
DateTimeOffset insertionTime,
ILogger log)
{
log.LogInformation("########## Function 1 ###############");
log.LogInformation($"NextVisibleTime: {nextVisibleTime}");
log.LogInformation($"NextVisibleTime: {(nextVisibleTime-insertionTime).TotalSeconds}");
log.LogInformation($"C# Queue trigger function processed: {item.AsString}");
Thread.Sleep(TimeSpan.FromMinutes(20));
}
[FunctionName("WorkerFunction2")]
public static async Task Function2(
[QueueTrigger("outputQueue")]
CloudQueueMessage item,
[Queue("outputQueue")]
CloudQueue outputQueue,
DateTimeOffset nextVisibleTime,
DateTimeOffset expirationTime,
DateTimeOffset insertionTime,
ILogger log)
{
log.LogInformation("########## Function 2 ###############");
log.LogInformation($"NextVisibleTime: {nextVisibleTime}");
log.LogInformation($"NextVisibleTime: {(nextVisibleTime - insertionTime).TotalSeconds}");
log.LogInformation($"C# Queue trigger function processed: {item.AsString}");
Thread.Sleep(TimeSpan.FromMinutes(20));
}
}
}
有了这个主机文件
{
"version": "2.0",
"extensions": {
"queues": {
"maxPollingInterval": "00:00:02",
"visibilityTimeout": "00:00:10",
"batchSize": 16,
"maxDequeueCount": 5,
"newBatchThreshold": 8
}
}
}
当我在队列上放一条简单的消息让它运行时,我看到以下内容:
这告诉我的是什么:
我没有保存任何链接到3.与此相矛盾的一方(抱歉我没有保存这些),但它们存在。我希望有人能回答这个问题,所以我可以澄清一下。