文章目录
1.分布式任务调度的背景
无论是互联网应用或者企业级应用,都充斥着大量的批处理任务。我们常常需要一些任务调度系统帮助我们解决问题。随着微服务化架构的逐步演进,单体架构逐渐演变为分布式、微服务架构。在此的背景下,很多原先的任务调度平台已经不能满足业务系统的需求。于是出现了一些基于分布式的任务调度平台
1.1.分布式任务调度的演变
在实际业务开发过程中,很多时候我们无可避免的需要使用一些定时任务来解决问题。通常我们会有多种解决方案:例如Quartz,还有spring框架自带的spring-task以及springboot自带的schedule (当然这种情况可能机器很少而且任务简单又不是很多的情况下)。然而,当我们应用复杂度升高,定时任务数量增多且任务之间产生依赖关系时,用上面的进行定时任务管理配置,就会非常混乱,严重影响工作效率。这时候就会产生一系列问题:
- 任务管理混乱,生命周期无法统一协调管理;
- 任务之间如果存在依赖关系,难以编排;
随着互联网的发展,分布式服务架构势越来越流行。相应也需要一个分布式任务调度系统来管理分布式架构中的定时任务。
1.2.分布式任务调度的优势
在分布式服务架构的基础上,由于独立业务的数量可能很多,此时如果定时任务单独在该服务中实现,很可能会出现难以管理的情况,且避免不了由于定时任务的更改而导致的业务重启。因此,一个独立的分布式任务调度系统是很必要的,可以用来全局统筹管理所有的定时任务。同时,将任务的配置单独抽离出来,作为该分布式任务调度系统的功能,就能做到定时任务的更改不影响任何业务,也不影响整个系统:
- 通过调度与任务分离的方式进行管理,大大降低了开发和维护成本;
- 分布式部署,保证了系统的高可用性,伸缩性,负载均衡,提高了容错性;
- 可以通过控制台部署和管理定时任务,方便灵活高效;
- 任务都可以持久化到数据库,避免了宕机和数据丢失带来的隐患,同时有完善的任务失败重做机制和详细的任务跟踪及告警策略
2.分布式调度任务框架介绍
2.1.Elastic-Job
Elastic Job是当当网架构师开发,是一个分布式调度解决方案,由两个相互独立的子项目Elastic-Job-Lite和Elastic-Job-Cloud组成;定位为轻量级无中心化解决方案,使用 jar 包的形式提供分布式任务的协调服务。支持分布式调度协调、弹性扩容缩容、失效转移、错过执行作业重触发、并行调度、自诊断和修复等等功能特性
2.2.TBSchedule
阿里早期开源的分布式任务调度系统。代码略陈旧,使用timer而非线程池执行任务调度。众所周知,timer在处理异常状况时是有缺陷的。而且TBSchedule作业类型较为单一,只能是获取/处理数据一种模式。而且文档缺失比较严重,还有就是要依赖Zookeeper
2.3.sia-task
SIA是Simple is Awesome的简称,SIA-TASK(微服务任务调度平台)是其中的一项重要产品,SIA-TASK契合当前微服务架构模式,具有跨平台,可编排,高可用,无侵入,一致性,异步并行,动态扩展,实时监控等特点,也要依赖Zookeeper,更偏向于解决任务编排和跨平台
2.4.xxl-job
xxl-job是大众点评员工徐雪里于2015年发布的分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用
2.5.对比图
任务编排 | 任务分片 | 跨平台 | 高可用 | 故障转移 | 实时监控 | |
---|---|---|---|---|---|---|
Quartz | × | × | .net | √ | × | Api监控 |
Elastic-Job | × | √ | × | √ | √ | √ |
TBSchedule | × | √ | × | √ | √ | √ |
sia-task | √ | √ | √ | √ | √ | √ |
xxl-job | 子任务依赖 | √ | √ | √ | √ | √ |
综上,更倾向于选择xxl-job:
- 轻量级,支持通过Web页面对任务进行动态CRUD操作,操作简单
- 只依赖数据库作为集群注册中心,接入开发简单,不需要ZK
- 高可用、解耦、高性能、监控报警、分片、重试、故障转移
- 团队持续开发,社区活跃
- 支持后台直接查看每个任务执行实时日志
3. xxl-job
3.1.特性
- 简单:支持通过Web页面对任务进行CRUD操作,操作简单,一分钟上手;
- 动态:支持动态修改任务状态、启动/停止任务,以及终止运行中任务,即时生效;
- 调度中心HA(中心式):调度采用中心式设计,“调度中心”自研调度组件并支持集群部署,可保证调度中心HA;
- 执行器HA(分布式):任务分布式执行,任务"执行器"支持集群部署,可保证任务执行HA;
- 注册中心: 执行器会周期性自动注册任务, 调度中心将会自动发现注册的任务并触发执行。同时,也支持手动录入执行器地址;
- 弹性扩容缩容:一旦有新执行器机器上线或者下线,下次调度时将会重新分配任务;
- 触发策略:提供丰富的任务触发策略,包括:Cron触发、固定间隔触发、固定延时触发、API(事件)触发、人工触发、父子任务触发;
- 调度过期策略:调度中心错过调度时间的补偿处理策略,包括:忽略、立即补偿触发一次等;
- 阻塞处理策略:调度过于密集执行器来不及处理时的处理策略,策略包括:单机串行(默认)、丢弃后续调度、覆盖之前调度;
- 任务超时控制:支持自定义任务超时时间,任务运行超时将会主动中断任务;
详情见:https://gitee.com/xuxueli0323/xxl-job
3.2.架构设计图
3.3.本地部署(linux)
3.3.1.下载源码
请下载项目源码并解压,使用IDEA工具导入项目
源码仓库地址
https://github.com/xuxueli/xxl-job
http://gitee.com/xuxueli0323/xxl-job
3.3.2.依赖环境
因为需要打包,所以要有Maven环境(需要在xxl-job所在的服务器上安装)
因为部署的是jar应用,启动时需要依赖Jdk1.8+(需要在xxl-job所在的服务器上安装)
因为xxl-job需要存储数据,需要依赖·Mysql数据库(不一定需要在xxl-job所在的服务器上安装mysql,可以配置连接其它机器的mysql库)
3.3.3.初始化数据库
在源码包中,有/xxl-job/doc/db/tables_xxl_job.sql文件,连接到mysql数据库,导入到mysql中
3.3.4.修改xxl-job-admin的配置
位置: /xxl-job/xxl-job-admin/src/main/resources/application.properties
3.3.5. 打包启动
启动脚本:start.sh
#!/bin/sh mvn clean mvn package nohup java -jar /Data/xxl-job/xxl-job-admin/target/xxl-job-admin-2.4.0.jar &
chmod +x start.sh
停止脚本:stop.sh
#!/bin/bash kill $(lsof -t -i:8899)
chmod +x stop.sh
3.3.6. 访问
http://172.16.3.38:8899/xxl-job-admin
admin
123456