azure - 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 个文件,而这个功能似乎不再起作用,函数再次同时处理所有文件,导致数据库无法处理所有请求。
我在这里想念什么?是否有一些我不知道的缩放问题?
解决方案
从这里:
如果要避免在一个队列上接收到的消息并行执行,可以将 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
推荐阅读
- vim - 是否有一个简单的命令可以让 NERDTree 换边?
- java - 为什么我们不能有名称与类名不同的构造函数,只要它们是唯一的
- django - Django 在 filter() 之后使用模型管理器方法
- sql-server - Azure VM 备份项中最近创建的 SQL 未显示
- spring-security - 如何在 Spring Security 授权服务器中实现 OpenID 连接?
- laravel - 同一个外键两次指向一个模型
- clojure - 从 data.json 转换为 cheshire
- hadoop - 获取没有数据的列族中的列名
- php - 无法使用php在浏览器上打开word文件
- c# - 使用 SqlCommand 时 SUM(Table) 不起作用