Blob 触发的 Azure 函数不再一次只处理一个 blob

Blob-triggered Azure Function doesn't process only one blob at a time anymore

我使用 Azure Functions 2.0 版编写了一个 blob 触发函数,使用 Gremlin API 将数据上传到 CosmosDB 数据库。每当函数被触发时,它都会读取blob,提取相关信息,然后查询数据库将数据上传到它上面。

但是,当所有文件同时上传到blob存储时,Function将同时处理所有文件,导致数据库无法处理太多请求。为了避免这种情况,我通过在 host.json 文件中将 batchSize 设置为 1 来确保 Azure Function 一次只处理一个文件:

{
  "extensions": {
    "queues": {
      "batchSize": 1,
      "maxDequeueCount": 1,
      "newBatchThreshold": 0
    }
  },
  "logging": {
    "applicationInsights": {
      "samplingSettings": {
        "isEnabled": true,
        "excludedTypes": "Request"
      }
    }
  },
  "version": "2.0"
}

一次处理 20 个文件时效果很好。

现在,我们尝试一次处理300个文件,这个功能好像不行了,Function再次同时处理所有文件,导致数据库无法访问处理所有请求。

我在这里错过了什么?是否存在一些我不知道的缩放问题?

来自here

If you want to avoid parallel execution for messages received on one queue, you can set batchSize to 1. However, this setting eliminates concurrency as long as your function app runs only on a single virtual machine (VM). If the function app scales out to multiple VMs, each VM could run one instance of each queue-triggered function.

当您 运行 在消费计划中时,您需要将此与应用设置 WEBSITE_MAX_DYNAMIC_APPLICATION_SCALE_OUT 结合使用。

或者,根据文档,更好的方法是通过 Function 属性 functionAppScaleLimit: https://docs.microsoft.com/en-us/azure/azure-functions/event-driven-scaling#limit-scale-out

WEBSITE_MAX_DYNAMIC_APPLICATION_SCALE_OUT当然可以。

您还可以在一个主机内扩展到多个 Function App 实例,这样您就可以拥有更少的主机,而每个主机拥有更多 FUNCTIONS_WORKER_PROCESS_COUNT。成本影响将取决于您的计划。

请注意,主机中的所有工作程序都会共享资源,因此建议将其用于更多 IO 绑定工作负载。