多实例WebApp触发Node.js WebJob遇HTTP 409冲突错误问询
我在拥有5个运行实例的WebApp上部署了一个Node.js触发式WebJob,使用Kudu API触发该WebJob,调用地址为:
https://xyz.scm.azurewebsites.net/api/triggeredwebjobs/webjobname/run
第一个请求被接收并启动WebJob,但后续所有请求均因作业处于运行状态而报错:
HTTP 409 Cannot start a new run since job is already running.
我原本期望可以通过该REST端点触发5次请求,由承载“空闲”作业的其他WebApp实例处理,但实际无法实现。即便WebApp有多个实例,也只能触发单个WebJob吗?
我已将应用服务计划扩缩至5个实例,尝试通过KUDU API触发“触发式WebJob”,预期可提交5次请求由空闲实例处理,实际却只有第一个请求返回HTTP 202,其余请求在第一个WebJob完成前均返回409错误。
原因分析
触发式WebJob默认启用**单实例运行(Singleton)**机制,这意味着无论WebApp有多少个实例,同一时间只能有一个实例运行该WebJob。Kudu API的触发请求是针对整个WebJob资源的,而非单个实例,所以当已有一个WebJob实例在运行时,后续触发请求会返回409冲突错误。
解决步骤
修改WebJob运行配置
在WebJob的根目录下创建或编辑settings.job文件,添加以下配置:{ "is_singleton": false }该配置会禁用单实例限制,允许WebApp的多个实例同时运行该触发式WebJob。
重新部署WebJob
将修改后的settings.job文件与WebJob代码一起重新部署到Azure,确保配置生效。验证并发触发
配置生效后,再次通过Kudu API触发WebJob,此时可同时发起多个请求,空闲的WebApp实例会分别处理这些请求,不会再返回409错误。
注意事项
- 若WebJob涉及共享资源(如数据库锁、文件读写),禁用单实例后需自行处理并发访问的冲突问题,避免数据不一致。
- 确保应用服务计划的实例数足够承载并发运行的WebJob实例,避免资源不足导致性能问题。
内容的提问来源于stack exchange,提问作者akum1143

