【问题标题】:BatchSize is not honored by Azure function (v2 on .Net Core) with QueueTrigger when running LOCALLY在本地运行时,带有 QueueTrigger 的 Azure 函数(.Net Core 上的 v2)不支持 BatchSize
【发布时间】:2018-12-05 17:29:48
【问题描述】:

我正在本地使用 QueueTrigger 在 host.json 文件中使用以下配置测试我的 Azure 功能(针对 .Net Core 的 v2)

“队列”:{ “批量大小”:1, “新批次阈值”:0 }

目的是限制每个函数应用实例一次只处理一个队列消息。

根据this Azure function doc

如果要在函数应用中最小化队列触发函数的并行执行,可以将批处理大小设置为 1。只有当函数应用在单个虚拟机 (VM) 上运行时,此设置才会消除并发。

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

{ “队列”:{ “最大轮询间隔”:2000, "visibilityTimeout" : "00:00:30", “批量大小”:16, "maxDequeueCount": 5, “新批次阈值”:8 } }

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

当我在本地对此进行测试时,我的 azure 函数总是同时从队列中获取多个 msg,即使在 host.json 文件中使用“BatchSize: 1”配置也是如此。我想知道是否是 b/c 我正在本地 Azure 函数运行时测试它。我尚未在 Azure 中对此进行测试。希望它能在 Azure 中按预期工作。

【问题讨论】:

  • 你的 host.json 是否遵循这个形状? { "version":"2.0", "extensions": { "queues": { "batchSize": 1, "newBatchThreshold": 0 } } }(参见文档:docs.microsoft.com/en-us/azure/azure-functions/…
  • 感谢您的回复。不,那不是。我在“扩展”中没有“队列”部分。我不知道我需要这样做。它是 { "version":"2.0", "queues": { "batchSize": 1, "newBatchThreshold": 0 } }。所以我更正了它,并再次尝试,现在我得到 NewBatchThreadhold 上的 ArgumentOutOfRangeException 为 0。异常发生在 Microsoft.Azure.WebJobs.Host.QueuesOptions 类中。
  • 另外,我尝试了“newBatchThreshold: 1”而不是 0,并确认它一次处理 2 个队列消息,正如预期的那样。

标签: azure-functions azure-functions-runtime queuetrigger


【解决方案1】:

问题原来是“队列”没有嵌套在“扩展”下

示例:

{
    "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。

【讨论】:

  • 是的,就是这样。我使用的是 Microsoft.Azure.WebJobs.Extensions.Storage v3.0.0。一旦我将它更新到 v3.0.2,并将“newBatchThreshold”设置为 0,它就按预期工作,即一次只处理 1 个队列消息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-06
  • 1970-01-01
  • 2016-09-05
相关资源
最近更新 更多