我在消费计划上有一个函数应用程序,它有一个队列触发函数,可以执行一些数据处理并写入Azure SQL。每次运行需要aprox 1分钟,我需要处理大约1000条消息一次到达。我担心许多这些运行同时击中数据库,而我可以让总时间延长。 这就是我的host.json目前的看法
{
"functionTimeout": "00:09:50",
"queues": {
"maxPollingInterval": 5000,
"visibilityTimeout" : "00:05:00",
"maxDequeueCount": 5,
"batchSize": 4,
"newBatchThreshold": 2
}
}
我更关心可靠性而不是总时间,所以我认为改进解决方案的方法是限制并发消耗单元的最大数量,并花费更长的时间来完成1000条消息。 设置最大并发消耗单位数的方法是什么?关于提高队列触发消费功能可靠性的其他建议将不胜感激。
答案 0 :(得分:3)
目前没有像Max Concurrent Consumption Units这样的设置。
您最好使用的切换是batchSize
,它定义了在单个实例(VM)上同时处理的消息数量。但是,如果应用程序扩展到多个实例,则每个实例都会运行batchSize
个项目。
因此,确切的调整并不严格,但通常您应该能够根据实际工作量调整batchSize
来达到您想要的目标。
最后,您可以将batchSize
与固定的应用服务计划结合使用,它可以为您提供确切的保证,但会使每次执行付费收益失效。
答案 1 :(得分:2)
考虑到标准Azure功能中缺少Max Concurrent Consumption设置,并且可以完全控制并发处理,您可以考虑使用Azure Durable Functions使用适当的模式。
由于您指的是运行问题,我希望您有(或可以添加)某种触发器以便开始处理并启动异步工作流程。如果这是可能的,您可以依赖Azure Durable Functions Fan-Out/Fan-In pattern,您可以在其中控制所需的并行度。但是,这也意味着您需要手动将1000条消息出列,而不是依赖绑定为您执行此操作。
高级工作流程示例:
接收触发器以通过绑定启动运行(可以是事件网格通知或向队列添加消息),或使用Monitoring Pattern轮询外部资源。
启动一个持久功能工作流程,使您使用Fan-Out/Fan-In pattern对所有消息进行出列并处理它们,或者使用更简单的方法,在没有扇出的情况下顺序处理1000条消息。