分布式定时任务
分布式定时任务 = 自动化 + 定时执行 + 海量数据 + 高效稳定
发展历程
在我们平时使用 Windows 中我们可能会遇到一个这样得情况,我们的网络可能出现问题,需要我们对计算机的网络进行重置,重置完成之后,显示几分钟后计算机会进行重启,这其实就是一个定时任务,我们也可以自定义自己的定时任务在 windows 中,我们可以使用命令
shutdown -s -t 600
然后把命令的内容保存在一个 .bat 文件当中,我们对文件进行双击之后就可以执行定时任务,我们还可以使用windows 中的计算机管理中系统工具下的任务计划程序,创建我们需要的定时任务
在 Linux 中我们可以使用 Cronjob command 进行任务的创建,在linux 平台下使用简单且稳定可靠,但是只是适用在 Linux 发行版的操作系统之中,也只能进行单台机器的操作
我们还可以使用各个语言提供的方法进行定时任务
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
SyncLocalCache();
}
},5000, 5 * 60 * 1000);
func main() {
ticker := time.NewTicker(5 * time.Minute)
for {
select {
case <- ticker.C :
SyncLocalCache()
}
}
}
在业内常见的定时任务框架
- Xxl-Job - 美团
- ScheduleX - 阿里巴巴
- TCT - 腾讯
- Elastic-Job - 当当网
- Saturn - 唯品会
Xxl-job 是一个分布式任务调度平台,是一个轻量级的分布式调度框架,核心目标是开发迅速 学习简单 轻量级 易于扩展;支持分片以及任务依赖和子任务依赖
Xxl-job 开源免费,并且轻量级,开箱即用,操作简单,上手快,维护成本低,对中小型企业友好
Schedule-X 是阿里巴巴基于Akka 架构自研发的新一代分布式任务调度平台,提供定时调度 调度任务编排以及分布式批量处理等功能
TCT - 分布式调度服务是腾讯云自主研发的高性能 高可靠通用的分布式任务调度中间件。可以指定时间规则触发调度任务,保障调度任务的可靠有序执行,支持时间表达式 调度任务执行生命周期的管理,用于解决传统定时调度任务单点和并发性的问题
分布式定时任务 & 单机定时任务 两者都可以实现自动化定时 延时 周期任务的调度,但是分布式定时任务可以支持更加庞大的业务体量,它的性能 伸缩性和稳定性更高
分布式定时任务 & 大数据处理引擎 可以对海量的数据进行处理,在性能 伸缩性以及稳定性方面都很高,但是在大数据处理引擎中主要的核心问题并不是分布式定时任务,两者的目的在于大数据需要将源数据进行处理形成结果数据,分布式除了这个还可以使用 HTTP 和 RPC 服务
实现原理
核心框架
分布式定时任务核心需要解决 触发 调度 执行 三个关键性的问题
- 触发器 Trigger 解析任务 生成触发事件
- 调度器 Schedule 分配任务 管理任务生命周期
- 执行器 Executor 获取任务执行单元 执行任务逻辑
Note:额外地需要增加一个控制台(Admin),进行任务的管理以及干预
主要的功能架构
控制台
- 任务 Job 任务的元数据
- 任务实例 JobInstance 在周期性任务中会生成多个任务实例
- 任务的结果 Jobresult 任务实例运行的结果
- JobHistory 更改任务的信息,任务实例的对应任务元数据可以不同
任务元数据是用户对所要执行的任务的一些属性定义(任务的类型 调度时机 执行行为)
任务实例是一个确定的 Job 的一次运行实例
触发器
触发器的主要职责是,对于给定的任务,解析触发的规则,在规定的时间触发任务的调度
触发器设计的一些约束
- 支持大量任务
- 支持妙级的任务调度
- 周期性任务的执行次数
- 保证秒级扫描的高性能(避免资源的浪费)
触发器的高可用需要解决的核心问题
- 不同的业务之间的调度相互影响时的处理方法
- 负责扫描以及触发的机器出现故障的解决方式
思路
- 在存储上,不同国别 业务进行资源的隔离
- 运行时,不同国别 业务分开执行
- 部署时 采用多机房集群部署 避免单点故障的发生,使用锁来保证任务的触发