01.前言

109 阅读5分钟

前言

1.为什么需要任务调度

  • 某电商系统需要在每天上午10点,下午3点,晚上8点发放一批优惠券
  • 某银行系统需要在信用卡到期还款日的前三天进行短信提醒
  • 某财务系统需要在每天凌晨0:10结算前一天的财务数据,统计汇总
  • 12306会根据车次的不同,而设置某几个时间点进行分批放票
  • 某网站为了实现天气实时展示,每隔5分钟就去天气服务器获取最新的实时天气信息

2.什么是任务调度

任务调度是指系统为了自动完成特定任务,在约定的特定时刻去执行任务的过程。有了任务调度即可解放更多的人力由系统自动去执行任务

3.任务调度的分类

  • 单机任务调度
  • 分布式任务调度

4.任务调度的两种表现形式

  • 一次性延时任务:延期一定时间后执行,比如10秒后执行一次,后续不再执行
  • 重复执行任务:指定某个时刻执行,比如每周一上午10点执行 或 每10秒执行一次

5.重复执行任务的两种执行方式

介绍

可重复执行任务也分为两类:固定延时schedule,固定速率scheduleAtFixedRate

延期问题

以JDK的Timer举例子,由于Timer内部仅维护一个线程来执行所有任务,所以当前一个任务耗时过长,可能会导致后一个任务的执行被延误

区别

出现任务延误的情况下,固定延时和固定速率的区别

  • 固定延时schedule:会顺延
  • 固定速率scheduleAtFixedRate:会把延误任务立马补上
  • 固定速率强调准点,固定时延强调间隔

6.任务调度实现

  1. Linux:crontab
  2. JDK:Timer,ScheduledThreadPoolExecutor
  3. Java类库:Quartz,SpringTask,HashedWheelTimer
  4. 分布式任务调度:Elastic-Job,XXL-JOB,PowerJob
  5. 云服务:阿里云SchedulerX

7.任务调度底层数据结构

任务调度底层一般是由两种数据结构实现:小顶堆,时间轮,后面会简单介绍它们

8.分布式任务调度

为什么需要分布式任务调度

  • 高可用:单机版的定时任务调度只能在一台机器上运行,如果程序或系统出现了异常就会导致功能不可用
  • 防止重复执行:在单机模式下,定时任务是没什么问题的。当我们部署了多台服务,同时又在每台服务又有定时任务时,定时任务可能会重复执行
  • 单机处理极限:原本1分钟需要处理1万个订单,但是现在需要1分钟内处理10万个订单。单机性能跟不上,虽然可以通过多线程或多进程等方式处理,但是单机能力毕竟有限,始终会有单机处理不过来的情况

常见的分布式任务调度中间件

  • Elastic-Job:当当网基于Quartz二次开发的弹性分布式任务调度系统,功能丰富强大,采用Zookeeper实现分布式协调,实现任务高可用以及分片
  • XXL-JOB:大众点评的分布式任务调度平台,是一个轻量级分布式任务调度平台,其核心设计目标是开发迅速,学习简单,轻量级,易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用
  • PowerJob:作者在阿里云的SchedulerX实习过,可能有点类似于那个
  • Saturn:唯品会开源的一个分布式任务调度平台,可以全域统一配置,统一监控,任务高可用以及分片并发处理。它是在Elastic-Job基础之上改良出来的
  • TBSchedule:淘宝的一款非常优秀的高性能分布式调度框架,目前被应用于阿里、京东、支付宝、国美等很多互联网企业的流程调度系统中

分布式任务调度要实现的目标

  • 并行任务调度:并行任务调度实现靠多线程,如果有大量任务需要调度,此时光靠多线程就会有瓶颈了,因为一台计算机CPU的处理能力是有限的。如果将任务调度程序分布式部署,每个结点还可以部署为集群,这样就可以让多台计算机共同去完成任务调度,我们可以将任务分割为若干个分片,由不同的实例并行执行,来提高任务调度的处理效率
  • 高可用:若某一个实例宕机,不影响其他实例来执行任务
  • 弹性扩容:当集群中增加实例就可以提高并行执行任务的处理效率
  • 任务管理与检测:对系统中存在的所有定时任务进行统一的管理及监测。让开发人员及运维人员能够时刻了解任务执行情况,从而做出快速的应急处理响应
  • 避免任务重复执行:当任务调度以集群方式部署,同一个任务调度可能会执行多次,可能对公司造成很多损失,所以我们需要控制相同的任务在多个运行实例上只执行一次

9.常见框架对比

8d764d65d03e24f06a2eca4bd4bcd588.png 8acbc54e1c806b51dfade3a3ac8960ba.png