限制Blob存储触发Azure函数的事件或函数实例数量
Azure Function与Service Bus连接数超限问题处理
架构概述
- Blob存储容器配置事件触发,Blob创建时自动触发Azure Function
- Azure Function读取XML文件,依据XML标签将消息发送至Service Bus对应队列(Service Bus包含多个队列)
- 多线程应用从Service Bus队列拉取消息并执行业务操作
问题描述
向Blob存储批量上传约25000个文件时,Azure Function会创建大量ServiceBusClient连接发送消息,触发Service Bus最大连接数(5000)限制,出现并行连接数超限错误。已尝试配置Azure Function及ServiceBusClient的重试策略,希望通过其他方案规避该问题。
解决方案
1. 限制Azure Function实例数量至2000
可以通过Azure平台配置直接限制Function应用的最大并发实例数,从源头控制并发连接的生成:
- 若使用弹性Premium计划或专用App Service计划:在Azure Portal进入Function应用,切换至「横向扩展」页面,设置「最大实例数」为2000
- 若使用消费计划:通过
WEBSITE_MAX_DYNAMIC_APPLICATION_SCALE_OUT应用设置限制实例数,将该参数值设为2000即可
2. 减慢Blob存储事件触发速度
通过配置Blob存储的事件订阅参数,降低事件向Function的推送速率:
- 启用事件批处理:在Blob存储的事件订阅设置中,开启批处理功能,设置合理的「批大小」(如每次批量推送100个事件)和「最大延迟时间」(如等待5秒再推送批次),减少单次触发的Function数量
- 设置速率限制:在事件订阅中配置「速率限制」,限制每秒推送至Function的事件数量(如设置为每秒300个),从上游控制Function的触发频率
额外优化建议(可选)
将ServiceBusClient声明为静态实例,在Function的静态构造函数中初始化,确保每个Function实例复用同一个ServiceBusClient,避免每次触发都创建新连接,从根本上减少连接数消耗。
内容的提问来源于stack exchange,提问作者Professeur Chen
相关产品推荐
相关产品推荐

