场景
任务调度是指系统在约定的特定时刻自动去执行指定任务的过程。 比如:
- 某新闻App每天上午10点给用户推送最新新闻。
- 某电商系统需要在每天上午 10 点,下午 3 点,晚上 8 点等不同适合发放一批优惠券。
- 某银行系统需要在信用卡到期还款日的前三天每天进行短信提醒。
- 某财务系统需要在每天凌晨 1点 结算前一天的财务数据,统计汇总。
- 某报表系统需要在每天凌晨 1点 读取业务数据生成报表数据。
- 12306 会根据车次的不同,而设置某几个时间点进行分批放票。
功能
一个任务调度平台,需要具备有以下几点功能:
- 核心功能:定时调度、任务管理、日志监控
- 高可用:集群、分片、失败处理
- 高性能:分布式锁
- 扩展功能:可视化运维、多语言、任务编排
架构
以 XXL-JOB
和 Elastic-job
说明分布式任务调度的一些基本工作原理。
1. XXL-JOB
以下内容参考自:xxl-job官网
XXL-JOB 是一个轻量级分布式任务调度平台,其设计理念主要是为了简化分布式系统中定时任务的管理和执行。 XXL-JOB 的架构提供了高效的任务调度能力,支持任务的分布式执行,以及故障转移和动态扩展的能力。
1.1 核心组件
-
调度中心
- 调度中心是 XXL-JOB 的核心部分,负责管理任务的注册、存储、调度和监控。它提供了一个用户界面,用于配置和管理任务的执行。
- 调度中心还负责触发执行器运行相应的任务,并处理执行结果。
-
执行器
- 执行器是任务执行的工作节点。在实际部署时,可以在不同的机器上部署多个执行器实例,以实现任务的分布式执行。
- 执行器从调度中心接收执行命令,执行具体的任务,并将执行结果反馈给调度中心。
1.2 架构原理
-
任务调度流程
- 用户在调度中心定义任务,包括任务的执行脚本、调度策略(如CRON表达式)、失败处理策略等。
- 调度中心根据任务配置的时间策略(如CRON表达式),触发任务的执行。
- 当任务触发时,调度中心选择一个或多个执行器发送执行命令。
- 执行器接收到执行命令后,开始执行具体的任务逻辑,并将执行结果返回给调度中心。
- 调度中心接收执行结果,并进行相应的处理,如重试、告警等。
-
负载均衡与故障转移
- XXL-JOB 支持自动记录每个执行器的负载情况,调度中心会根据这些信息智能选择负载较低的执行器执行任务,实现负载均衡。
- 在执行器出现故障时,调度中心可以自动将任务转移到其他健康的执行器上,实现故障转移。
-
动态扩展
- 执行器支持水平扩展。当任务量增加,导致现有执行器负载过高时,可以简单地增加更多的执行器实例,调度中心会自动识别并利用新增的执行器资源。
-
高可用性设计
- XXL-JOB 调度中心通常部署为集群模式,以避免单点故障。通过数据库共享任务配置和执行记录,任何一个调度中心实例都能处理任务调度和管理。
-
运行模式
-
Bean模式:每个Bean模式任务都是一个Spring的Bean类实例,它被维护在“执行器”项目的Spring容器中。任务类需要加“@JobHandler(value=”名称”)”注解,因为“执行器”会根据该注解识别Spring容器中的任务。任务类需要继承统一接口“IJobHandler”,任务逻辑在execute方法中开发,因为“执行器”在接收到调度中心的调度请求时,将会调用“IJobHandler”的execute方法,执行任务逻辑。
-
GLUE模式(Java):每个 “GLUE模式(Java)” 任务的代码,实际上是“一个继承自“IJobHandler”的实现类的类代码”,“执行器”接收到“调度中心”的调度请求时,会通过Groovy类加载器加载此代码&
-