首页 > 解决方案 > Blob 触发的 Azure 函数不再一次只处理一个 Blob

问题描述

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

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

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

这一次对 20 个文件非常有效。

现在,我们尝试一次处理 300 个文件,而这个功能似乎不再起作用,函数再次同时处理所有文件,导致数据库无法处理所有请求。

我在这里想念什么?是否有一些我不知道的缩放问题?

标签: azure.net-coreazure-functionsazure-cosmosdb

解决方案


这里

如果要避免在一个队列上接收到的消息并行执行,可以将 batchSize 设置为 1。但是,只要函数应用仅在单个虚拟机 (VM) 上运行,此设置就会消除并发性。如果函数应用扩展到多个 VM,则每个 VM 可以运行每个队列触发函数的一个实例。

在消耗计划中运行时,您需要将其与应用程序设置WEBSITE_MAX_DYNAMIC_APPLICATION_SCALE_OUT结合起来。

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


推荐阅读