当 运行 LOCALLY 时,带有 QueueTrigger 的 Azure 函数(.Net Core 上的 v2)不支持 BatchSize

BatchSize is not honored by Azure function (v2 on .Net Core) with QueueTrigger when running LOCALLY

我正在使用 host.json 文件

中的以下配置在本地使用 QueueTrigger 测试我的 Azure 函数(面向 .Net Core 的 v2)

"queues":{ "batchSize": 1, "newBatchThreshold": 0 }

目的是限制每个 Function App 实例一次只能处理一个队列消息。

根据this Azure function doc

If you want to minimize parallel execution for queue-triggered functions in a function app, you can set the batch size to 1. This setting eliminates concurrency only so long as your function app runs on a single virtual machine (VM).

在host.json文件中,有这些配置

{ "queues":{ "maxPollingInterval": 2000, "visibilityTimeout":“00:00:30”, "batchSize": 16, "maxDequeueCount": 5, "newBatchThreshold": 8 } }

在我们的例子中,我并不是要消除并发性,而是要确保每个函数应用程序实例一次只处理一个队列消息。然后,如果我们将函数应用程序扩展到多个 VM 上的 运行,则保证每个 VM 一次只能处理一个队列消息。更具体地说,计划是 运行 App Service 计划下的 azure 功能,而不是 Consumption 计划(b/c 你对 Consumption 计划几乎没有控制权),并将 Scale Out 规则设置为监控队列,最多 N 个实例 (VM)。此设置允许我们一次将每个 VM 专用于 运行 一个 azure 函数应用程序实例,最多 N 个 VM。

当我在本地测试时,我的 azure 函数总是同时从队列中获取多个消息,即使 host.json 文件中的 "BatchSize: 1" 配置也是如此。我想知道是不是 b/c 我在本地 Azure 函数 运行 中测试这个。我还没有在 Azure 中测试过这个。希望它在 Azure 中按预期工作。

问题原来是 "queues" 没有嵌套在 "extensions"

示例:

{
    "version": "2.0",
    "extensions": {
        "queues": {
            "maxPollingInterval": "00:00:02",
            "visibilityTimeout" : "00:00:30",
            "batchSize": 16,
            "maxDequeueCount": 5,
            "newBatchThreshold": 8
        }
    }
}

对于这种情况,引用的扩展名(Microsoft.Azure.WebJobs.Extensions.Storage 也应至少为 3.0.1,因为之前 a bugnewBatchThreshold 设置为 0。