大家好,我是君哥。
分布式任务调度平台执行一次调度任务,一般会经历下面的过程。
图片
在上图中,调度中心从注册中心拉取执行器列表,然后选择一个执行器来执行任务,任务执行完成后,执行器会把任务执行结果通知调度中心。
主流的分布式任务调度平台,比如 XXL-JOB、PowerJob 等都设计了调度中心、执行器这两个核心组件。
1.调度中心
调度中心的作用不光是简单的任务触发,还包括管理执行器列表、任务结果管理等。
1.1 任务调度方式
任务调度方式主要包括定时调度和 API 触发调度。
定时调度有两种方式,一种是调度中心在配置的任务执行时间给执行器发送任务调度信号,直接把任务发起。第二种是调度中心给任务执行器发送任务触发时间,任务执行器自己触发,比如使用延迟队列。
API 触发调度一般是调度中心收到外部 API 请求后,发起任务调度。
1.2 任务管理
调度中心可以创建、更新、删除任务。下图来自 XXL-JOB 官网,XXL-JOB 在调度中心配置任务。
图片
1.3 任务结果
调度中心监控任务执行结果,查看任务执行日志,对于执行失败的任务也可以采取一些处置措施,比如重新触发任务执行。
1.4 调度时效
定时任务对执行开始时间有要求,这就需要调度中心能够高效地把任务调度请求发出去,不能积压调度任务。
1.5 调度策略
调度策略决定了调度中心选择哪一个执行器来执行任务,比如第一个、最后一个、随机、轮询、广播等。
2.执行器
执行器是分布式任务调度系统中最核心的部分,它是真正执行跑批任务、决定跑批结果的组件。
2.1 执行器注册
执行器要想收到任务触发信号,必须首先在注册中心进行注册,被调度中心成功拉取到。
注册成功后,需要周期性地给注册中心发送心跳,让调度中心感知到。
2.2 集群部署
为了保证整个调度平台的高可用,执行器必须集群部署,这样如果调度中心选择调度的节点出现故障,可以进行重试把信号发送给下一个节点,不用担心任务不能被成功调度。
图片
2.3 多线程设计
执行器为了提高执行效率,一般会启动多线程。执行器应该能支持线程数量灵活配置。比如一个数据量比较大的任务,可以配置多线程分段处理。但为了不影响同一个执行器上的其他任务,不能把线程数配置地太高,比如可以使用一半的线程处理当前任务。
对于更加复杂的批量任务,也可以设计成多个执行器参与来提高效率。比如一个任务调度到 4 个执行器执行,每个执行器 4 个线程参与,提高执行效率。
图片
2.4 动态扩容
当所有的执行器都满负荷运行,会出现任务排队的情况,如果执行器集群可以动态扩容,就可以增加几个执行器节点,调度中心把任务调度到新的节点上。
2.5 阻塞控制
单个执行器很可能会出现批次任务排队的情况,有必要采取一些阻塞控制策略。比如按照入队顺序依次执行,或者丢弃排队的任务直接给调度中心返回失败。
3 总结
调度中心和执行器是分布式任务调度平台的两个核心组件,调度中心负责任务触发和调度,执行器负责任务执行和结果反馈。理解了这 2 个核心概念,就可以很容易地理解主流分布式调度平台的设计原理了。