vlambda博客
学习文章列表

xxl-job 架构及源码分析-调度组件

调度 JobScheduleHelper 组件分析

调度的主要流程
  • XxlJobScheduler 初始化的时候,会通过组件 JobScheduleHelpe 的 start 方法启动两个 daemon 线程,scheduleThread 和 ringThread 。
  • scheduleThread 主要负责从数据库获取 未来5s内待调度的 job列表。job 的数量 =(fast + slow 线程池数量)* 20 。按照秒的维度,把秒刻度的对应的 job 存储到共享 hashmap 中。ringThread 则从 共享 hashmap 中,按照秒的维度,获取对应的 jobId 列表 , 触发 job 。
ScheduleThread 高可用与一致性
  • xxl-job 支持高可用部署。多实例 ,共用一个 mysql 数据库。有实例宕机,xxl-job 集群可以正常提供服务。
  • scheduleThread 通过 msyql 的 for update 悲观锁实现调度的并发控制。获取不到锁的实例,则进入阻塞状态,不至于出现并发问题。
ScheduleThread 高性能
  • 从数据库获取的 job 数量,按照 20 倍的(triggerPoolFastMax + triggerPoolSlowMax 线程池数量)。triggerPoolFastMax 默认 200,triggerPoolSlowMax 默认 100。假设一个 job 耗时 50ms, 则 一个线程的 qps = 1000/50 = 20。300 个线程,总的qps = 300 * 20 = 6000 。qps 妥妥超过 1000。
  • 从数据库获取的job,通过异步并发的方式调度。
RingThread 的高性能
  • 从内存的 hashmap 中,根据时间-秒,获取对应的 jobId List。时间复杂度为 O(1) 。
ScheduleThread 和 RingThread 协作架构图




END