Quarkus调度器在Azure多实例中是否共享?并发问题咨询
Quarkus调度器在Azure多实例部署下的行为说明及分布式锁解决方案
关于Quarkus调度器的多实例行为
Quarkus的调度器是实例级独立运行的——在Azure多实例部署场景中,每个应用实例都会启动自己的调度器进程,完全独立于其他实例。也就是说,你的15秒定时任务会在每个实例上同时触发,必然会引发并发读写、重复处理等问题,这和你担心的情况一致。
基于Azure存储Blob的分布式锁实现方案
既然每个实例都会独立执行调度任务,用分布式锁来保证单实例执行是合理的选择,Azure存储Blob的租约机制可以完美实现这个需求,具体步骤如下:
- 提前在Azure存储中创建一个专门用于锁的Blob(比如命名为
task-lock-blob) - 在调度任务的执行逻辑开头,尝试为这个Blob申请独占租约,租约时长建议设置为20秒(略长于你的15秒任务周期,避免任务未完成租约就到期)
- 如果租约申请成功,说明当前没有其他实例在执行任务,正常执行查询、数据更新等操作
- 如果租约申请失败,直接跳过本次任务执行
- 任务执行完成后,主动释放Blob租约;如果任务执行超时,租约到期后会自动释放,不影响下一轮调度
关键注意点
- 租约时长必须大于任务的最长预期执行时间,防止任务执行过程中租约过期,导致多个实例同时执行
- 要添加异常处理逻辑,处理Blob租约操作时的网络异常或存储服务异常,避免出现锁无法正常释放的情况
内容的提问来源于stack exchange,提问作者John Malkovoch
相关产品推荐
相关产品推荐

