一个项目在集群中运行,如何让定时任务只运行一次?不加限制就会导致重复计算的问题。
使用zookeeper,redis等手动存储定时任务执行状态等信息,保证只执行一次。
将定时任务抽取到一个单独的项目中(单机运行),但是任务具体内容通过远程调用(dubbo,mq等)调用具体的分布式服务。也就是定时任务只是单独的用于任务触发,具体任务还是分布式执行的。
使用各种分布任务调度系统,如Uncode-Schedule
假设你最简单的方式使用quartz
,那么你在代码中就要修改了,在job逻辑中加入获取锁的操作,这个锁可以做到数据库,具体方法是:插入一条有业务意义主键记录,执行时,集群中相同的job只会有一条插入成功,这就代表它获得了锁,可以执行,否则退出此次job,不执行。
Configure Clustering with JDBC-JobStore
Quartz’s clustering features bring both high availability and scalability to your scheduler via fail-over and load balancing functionality.
quartz 本身就是支持集群,容错,负载均衡的。不需要改任何代码即可实现。
15 回答8.4k 阅读
8 回答6.2k 阅读
5 回答3.2k 阅读✓ 已解决
3 回答3.6k 阅读✓ 已解决
1 回答4k 阅读✓ 已解决
3 回答6k 阅读
2 回答2.8k 阅读✓ 已解决
quartz框架支持集群