前言
1.为什么需要任务调度
- 某电商系统需要在每天上午10点,下午3点,晚上8点发放一批优惠券
- 某银行系统需要在信用卡到期还款日的前三天进行短信提醒
- 某财务系统需要在每天凌晨0:10结算前一天的财务数据,统计汇总
- 12306会根据车次的不同,而设置某几个时间点进行分批放票
- 某网站为了实现天气实时展示,每隔5分钟就去天气服务器获取最新的实时天气信息
2.什么是任务调度
任务调度是指系统为了自动完成特定任务,在约定的特定时刻去执行任务的过程。有了任务调度即可解放更多的人力由系统自动去执行任务
3.任务调度的分类
- 单机任务调度
- 分布式任务调度
4.任务调度的两种表现形式
- 一次性延时任务:延期一定时间后执行,比如10秒后执行一次,后续不再执行
- 重复执行任务:指定某个时刻执行,比如每周一上午10点执行 或 每10秒执行一次
5.重复执行任务的两种执行方式
介绍
可重复执行任务也分为两类:固定延时schedule,固定速率scheduleAtFixedRate
延期问题
以JDK的Timer举例子,由于Timer内部仅维护一个线程来执行所有任务,所以当前一个任务耗时过长,可能会导致后一个任务的执行被延误
区别
出现任务延误的情况下,固定延时和固定速率的区别
- 固定延时schedule:会顺延
- 固定速率scheduleAtFixedRate:会把延误任务立马补上
- 固定速率强调准点,固定时延强调间隔
6.任务调度实现
- Linux:crontab
- JDK:Timer,ScheduledThreadPoolExecutor
- Java类库:Quartz,SpringTask,HashedWheelTimer
- 分布式任务调度:Elastic-Job,XXL-JOB,PowerJob
- 云服务:阿里云SchedulerX
7.任务调度底层数据结构
任务调度底层一般是由两种数据结构实现:小顶堆,时间轮,后面会简单介绍它们
8.分布式任务调度
为什么需要分布式任务调度
- 高可用:单机版的定时任务调度只能在一台机器上运行,如果程序或系统出现了异常就会导致功能不可用
- 防止重复执行:在单机模式下,定时任务是没什么问题的。当我们部署了多台服务,同时又在每台服务又有定时任务时,定时任务可能会重复执行
- 单机处理极限:原本1分钟需要处理1万个订单,但是现在需要1分钟内处理10万个订单。单机性能跟不上,虽然可以通过多线程或多进程等方式处理,但是单机能力毕竟有限,始终会有单机处理不过来的情况
常见的分布式任务调度中间件
- Elastic-Job:当当网基于Quartz二次开发的弹性分布式任务调度系统,功能丰富强大,采用Zookeeper实现分布式协调,实现任务高可用以及分片
- XXL-JOB:大众点评的分布式任务调度平台,是一个轻量级分布式任务调度平台,其核心设计目标是开发迅速,学习简单,轻量级,易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用
- PowerJob:作者在阿里云的SchedulerX实习过,可能有点类似于那个
- Saturn:唯品会开源的一个分布式任务调度平台,可以全域统一配置,统一监控,任务高可用以及分片并发处理。它是在Elastic-Job基础之上改良出来的
- TBSchedule:淘宝的一款非常优秀的高性能分布式调度框架,目前被应用于阿里、京东、支付宝、国美等很多互联网企业的流程调度系统中
分布式任务调度要实现的目标
- 并行任务调度:并行任务调度实现靠多线程,如果有大量任务需要调度,此时光靠多线程就会有瓶颈了,因为一台计算机CPU的处理能力是有限的。如果将任务调度程序分布式部署,每个结点还可以部署为集群,这样就可以让多台计算机共同去完成任务调度,我们可以将任务分割为若干个分片,由不同的实例并行执行,来提高任务调度的处理效率
- 高可用:若某一个实例宕机,不影响其他实例来执行任务
- 弹性扩容:当集群中增加实例就可以提高并行执行任务的处理效率
- 任务管理与检测:对系统中存在的所有定时任务进行统一的管理及监测。让开发人员及运维人员能够时刻了解任务执行情况,从而做出快速的应急处理响应
- 避免任务重复执行:当任务调度以集群方式部署,同一个任务调度可能会执行多次,可能对公司造成很多损失,所以我们需要控制相同的任务在多个运行实例上只执行一次
9.常见框架对比