Quartz 插件在集群模式下保证作业的高可用性主要依赖于以下几个机制:
- 故障转移(Failover):
当一个节点在执行任务时失败,其他节点会检测到这个状况并接管未完成的任务。这是通过定期检查节点的“心跳”来实现的,如果某个节点在预定的检查周期内没有更新其状态,则认为该节点已经故障,其他节点会接管其任务。 - 数据库行锁:
Quartz 集群使用数据库行锁来避免在同一时间由多个节点执行相同的作业。当一个触发器触发作业时,集群中的一个节点会获取对应的锁,这样其他节点就不会执行相同的作业。 - 集群检查间隔(Cluster Checkin Interval):
集群中的节点会定期(由clusterCheckinInterval
属性控制)向数据库发送“心跳”,以表明它们仍然在线。如果一个节点在一定时间内没有发送心跳,其他节点就会认为它已经离线,并会尝试接管其任务。 - 任务恢复:
Quartz 允许你为作业配置“请求恢复”属性。如果作业在执行过程中因为节点故障而未完成,其他节点可以恢复并执行这些作业。 - 负载均衡:
集群中的每个节点都有机会触发作业,哪个节点先获得触发器的锁,就由哪个节点执行作业。这种机制可以平衡作业在不同节点之间的分布,避免单一节点过载。 - 实例状态和锁机制:
Quartz 集群通过qrtz_scheduler_state
和qrtz_locks
表来管理节点状态和锁。这些机制确保了集群中的节点能够协调作业的执行,防止冲突和重复执行。
通过这些机制,Quartz 插件能够在集群模式下实现作业的高可用性和负载均衡,确保关键任务的可靠性和稳定性。