公司7代产品采用了spring Boot技术(以下简称SB,哈哈😂),SB创建定时任务也非常简单,用其自定义的注解即可,但遗憾的是,我们出其不意地集成了quartz插件(囧)。
其实quartz本身可以在集群中使用的,它提供了一种数据库锁的机制,来防止各个节点部署的quartz实例重复执行。一个Quartz集群中的每个节点是一个独立的Quartz应用。这就意味着你必须对每个节点分别启动或停止。Quartz集群中,独立的Quartz节点并不与另一其的节点或是管理节点通信,而是通过相同的数据库表来感知到另一Quartz应用的。这点挺好,但是还不够好,需要建立12张表,总觉得这种方法笨重,不采纳。
一种方法就是在每个应用的配置文件里,增加开关【是否开启定时任务】,只让一个节点运行定时任务即可,然后关于【启动任务】、【停止任务】这些接口,直接改写nginx配置,路由到启用了quartz的节点上。优点是满足需求了,但却失去了高可用性,另外现场实施还得记住哪个节点打开了开关,麻烦!
二种方法也即我推荐的方法,采用redis锁的机制防止并发,要知道 任务号+触发器+触发时间 是唯一的,这样既能满足需求又能保持高可用,而且修改幅度最小,完美!
可惜以上三种方法都没有被领导采纳,他们提出了第四种,即将定时任务独立出去,单独部署一个节点来跑quartz任务,集群中的每个节点都不再部署quartz任务,这样肯定不会重复执行,但同样失去了高可用,同样还得需多提供一台机器。