Azure Functions Service Bus会话触发器吞吐量不足调优咨询
1. 禁用动态并发避免覆盖自定义配置
Azure Functions 3.x版本默认启用动态并发控制,会自动根据实例负载调整触发器并发数,直接覆盖你在host.json中配置的maxConcurrentSessions参数,这是导致并发数不达预期、实例闲置的最常见原因。
请在host.json根节点添加以下配置,禁用动态并发,让自定义的会话并发配置生效:
{ "version": "2.0", "concurrency": { "dynamicConcurrencyEnabled": false, "maxConcurrentActivityFunctions": 200 }, // 保留原有其他配置 }
maxConcurrentActivityFunctions参数控制单实例最多可同时执行的函数调用数,需设置为不小于预期的单实例会话并发数。
2. 调整单实例多工作进程配置
Windows消费计划默认单实例只启动1个Functions工作进程,你可以通过添加Function App应用配置提升单实例的处理能力,充分利用实例资源:
- 添加配置项
FUNCTIONS_WORKER_PROCESS_COUNT,取值范围110,建议设置为48,每个工作进程都会独立加载Service Bus触发器,各自持有你配置的maxConcurrentSessions:200的并发配额,大幅提升单实例的会话处理上限。 - 若需要更大的全局并发,可配置
WEBSITE_MAX_DYNAMIC_APPLICATION_SCALE_OUT,显式指定Function App最大可扩容的实例数,避免订阅默认配额限制扩容。
3. 修复Service Bus扩展版本已知问题
你当前使用的Microsoft.Azure.WebJobs.Extensions.ServiceBus 5.0.0属于早期大版本,存在多个会话调度相关的已知bug,会导致会话分配不均、实例闲置的问题,建议直接升级到5.13.0及以上的稳定版本,即可解决大部分底层调度问题。
同时可以根据单条消息处理速度调整prefetchCount:如果单条消息处理耗时<100ms,可将prefetchCount调整到500,减少网络交互开销,提升消费速度。
4. 限制Event Hub触发器的资源占用
同个Function App内的多个触发器会共享实例的并发配额,需要给Event Hub触发器也设置合理的并发上限,避免它占用过多资源导致Service Bus会话处理无法拿到配额:
在host.json的extensions节点下添加Event Hub的并发控制配置:
"eventHubs": { "maxEventBatchSize": 100, "prefetchCount": 300, "processorOptions": { "maxConcurrentCallsPerPartition": 10 } }
根据实际业务的Event Hub处理优先级调整参数,预留足够的并发配额给Service Bus会话处理。
5. 核对超时配置匹配业务逻辑
Windows消费计划默认的函数执行超时时间为5分钟,你当前配置的maxAutoRenewDuration:00:55:00远超过消费计划的最大允许超时(10分钟),会导致函数执行到超时上限后被强制终止,会话被释放后重新分配,反而拖慢整体消费速度。请添加应用配置FUNCTIONS_TIMEOUT,设置为00:10:00,同时根据实际单条消息的最大处理时间调整maxAutoRenewDuration不超过10分钟。
内容的提问来源于stack exchange,提问作者Markus S.

