Azure functions Azure函数服务总线触发器触发的次数多于队列中的消息

Azure functions Azure函数服务总线触发器触发的次数多于队列中的消息,azure-functions,azureservicebus,azure-servicebus-queues,azure-function-app,azure-servicebus-topics,Azure Functions,Azureservicebus,Azure Servicebus Queues,Azure Function App,Azure Servicebus Topics,我有两个服务总线队列和Azure服务总线队列触发器 该函数从队列中读取1000条消息,并将它们转发给另一条(用于测试) 当发布到Azure(计划消耗)时,我得到1030+个函数点击,尽管我的队列中只有1000条消息。我认为这与函数实例的数量有关 Q:如何对一个函数实例只处理一次唯一消息 [FunctionName("Function1")] public static async Task Run([ServiceBusTrigger("export

我有两个服务总线队列和Azure服务总线队列触发器

该函数从队列中读取1000条消息,并将它们转发给另一条(用于测试) 当发布到Azure(计划消耗)时,我得到1030+个函数点击,尽管我的队列中只有1000条消息。我认为这与函数实例的数量有关

Q:如何对一个函数实例只处理一次唯一消息

[FunctionName("Function1")]
        public static async Task Run([ServiceBusTrigger("export-queue",
        Connection = "Connection")]
        string myQueueItem, ILogger log)
        {
            log.LogInformation($"Message: {myQueueItem}:{DateTime.Now}");
            Thread.Sleep(2000);
            queueClient = new QueueClient(ServiceBusConnectionString, QueueName);

            var message = new Message(Encoding.UTF8.GetBytes(myQueueItem));
            await queueClient.SendAsync(message);
            await queueClient.CloseAsync();
        }


默认情况下,
ServiceBusTrigger
正在使用。这在技术上意味着,如果消息锁已被锁定,则可以多次处理消息。这就解释了为什么对于1000条传入消息,您会得到超过1000次调用

另一个角度是函数执行的持续时间以及预取大小。如果执行所需的时间足够长,以致于丢失对某些预取消息的锁定,请减少


也可以考虑以至少一次处理消息的方式设计解决方案,而不是一次处理。

< P> <强>对我有用。< /强>

为您的host.json添加扩展:

"extensions": {

    "serviceBus": {
      "prefetchCount": 1,
      "messageHandlerOptions": {
        "autoComplete": true,
        "maxConcurrentCalls": 1,
        "maxAutoRenewDuration": "00:05:00"
      },
      "sessionHandlerOptions": {
        "autoComplete": true,
        "messageWaitTimeout": "00:00:30",
        "maxAutoRenewDuration": "00:55:00",
        "maxConcurrentSessions": 10
      }
    }
  }