如何在多实例Azure App Service中控制基于租户的作业执行
Azure App Service多实例部署Spring多租户定时作业方案及实例数查询方法
跨实例按租户作业执行管控逻辑设计
核心实现思路
通过分片绑定+分布式锁的方案实现租户作业隔离,避免多实例下任务重复执行:
- 提前做租户分片配置:将所有租户ID按照哈希取模或者固定区间的方式划分为N个分片,N的取值要高于你预期的App Service最大扩容实例数,避免后续扩容时需要调整分片规则。
- 引入分布式锁绑定分片与实例:优先选用Azure原生服务做锁存储,可选Azure Blob存储租约、Azure Redis缓存两种方案,每个分片对应唯一的锁标识。每个App Service实例启动后,定时轮询抢锁,抢到某几个分片的锁后,仅处理这几个分片下所有租户的批处理作业,未抢到锁的分片不处理。
- 配置失效转移机制:给所有分布式锁设置合理的超时时间,持有锁的实例需要定时更新锁的过期时间(心跳),如果实例异常 crash,锁会自动超时释放,其他存活实例下次抢锁时就会承接这部分分片的作业,不会出现任务中断。
- 适配Spring现有定时逻辑:可以直接集成
ShedLock第三方组件,不需要从零实现锁逻辑,只需将锁的存储源配置为你选用的Azure Redis或者Blob存储即可,和现有Spring定时任务的改造成本极低。
补充注意:所有批处理作业必须做好幂等校验,极端锁冲突场景下即使同个租户的任务被两个实例同时触发,也不会出现数据重复写入、脏写的问题。
Azure App Service实例总数查询方法
分为代码内查询和控制台查询两类场景:
代码内运行时查询
- 每个App Service实例的唯一标识可以直接读取环境变量
WEBSITE_INSTANCE_ID获取 - 查询当前App Service总实例数可以调用Azure Resource Manager(ARM) 接口,身份认证直接用App Service自带的系统分配托管身份,不需要额外存储密钥,请求路径为:
https://management.azure.com/subscriptions/{你的订阅ID}/resourceGroups/{你的资源组名}/providers/Microsoft.Web/sites/{你的App Service名称}/instances?api-version=2022-03-01,返回结果的数组长度就是当前正在运行的实例总数。
运维侧查询
- Azure Portal 方式:进入对应App Service的「概览」页,即可直接看到当前运行的实例数指标
- Azure CLI 方式:执行以下命令直接返回实例总数:
az webapp list-instances --name <app-service名称> --resource-group <资源组名称> --query "length([])"
内容的提问来源于stack exchange,提问作者ParagPatil
相关产品推荐
相关产品推荐

