负载均衡下 定时任务的解决方案

本文介绍了一种在SpringBoot应用中使用MongoDB解决多实例定时任务并发执行问题的方法,通过在MongoDB中创建标记来确保同一时刻只有一个实例执行定时任务,避免了任务的重复执行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

场景入下

        系统使用springboot 进行定时任务的处理  数据库是mongo(mongo 做统计真心不好使) 这里我们的 项目可能会运行多个实例    这意味着 定时任务可能会被多次执行 需要解决这个问题

一下是解决思路:

        1.  在触发执行的时间点  每个执行任务的线程 向mongo的某个表中(比如 schedule_log)中写入标记 =====>占位置

        2.  在等待一段时间后 每个线程 读取当日的 标记数据  然后使用排序 (升序 降序)选出第一个记录(也可以是第二个 户主要是为了确定 执行任务的线程) 然后读取某个属性(这个属性 需要在方法里面保存 并且需要唯一)  看看是不是自己的 

         3. 如果是自己的 那么接下来 有自己 负责执行定时任务  同时在表中删除 其他的记录  如果不是自己 则删除 自己的记录  对任务的执行情况 进行监控(这里 删除 也要设置一定的时间 间隔  保证 所有的线程 都可以读到全部的数据)

          4.  执行任务线程 执行任务  执行完后  修改标记的的某个属性  其他线程 轮训改属性 当轮询结果 显示任务结束的时候  轮询线程 也退出   任务执行结束 (这里 要设置一个 轮询的次数 和间隔   时间设置 个大概就可以了  不用很准确 还有后手)

          5.  在指定的轮询次数完成后 如果还是显示 任务没有结束  就开始 检查表的总行数(当日生成的) 是否会发生变化,这里也要设置一定的 轮询时间间隔和次数   需要注意的如果轮询的时候 数量发生了变化  轮询次数 也要随之 动态变化 

           6.  表的轮询次数 结束后 回到 上一个 方法  再次 检查标记  如果显示任务完成  ok 那么就完成了  如果 还没完成 那么 就说明一项 那个执行定时任务线程的所在机器 挂了  此时需要 删除 此时的 执行标记

         7. 剩下的 机器 重新再表中 插入标记  从第二步开始 继续

*** 这里可是设置一个策略  当任务重复执行几次后  不管 有没有 机器剩下  都放弃任务的执行 

 

结构图之后再补上

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值