基本需求:

  • 调度方法是否丰富,满足常规和特殊需求
  • 任务组合和任务依赖
  • 分布式(容灾能力)
  • 状态监控(集成)
  • 性能(高频率调度)

几款任务调度框架

http://www.oschina.net/project/tag/327/task-schedule

LTS(Light-Task-Scheduler)

http://git.oschina.net/hugui/light-task-scheduler

LTS 有主要有以下四种节点:

  • JobClient:主要负责提交任务, 并接收任务执行反馈结果。
  • JobTracker:负责接收并分配任务,任务调度。
  • TaskTracker:负责执行任务,执行完反馈给JobTracker。
  • LTS-Admin:(管理后台)主要负责节点管理,任务队列管理,监控管理等。LTS支持任务类型:
  • 实时任务:提交了之后立即就要执行的任务。
  • 定时任务:在指定时间点执行的任务,譬如 今天3点执行(单次)。
    Cron任务:CronExpression,和quartz类似(但是不是使用quartz实现的)譬如 0 0/1 * * * ?

优点:可以部署多个并动态进行删减,实现负载均衡、分布式、支持暂停(删除),支持任务监控统计,节点任务监控,JVM监控。解决分布式任务调度问题

缺点:使用方式单一,有管理界面

Airflow

http://airflow.incubator.apache.org/

作流分配管理系统,通过有向非循环图的方式管理任务流程,设置任务依赖关系和时间调度。

独立于我们要运行的任务,只需要把任务的名字和运行方式提供给Airflow作为一个task就可以。

优点:部署简单,任务和运行方式分离;分布式;SPI支持;任务依赖;

Quartz

控制器 scheduler,任务调度控制器

RemoteMBeanScheduler, RemoteScheduler 和 StdScheduler。

触发器 trigger 调度时间,按照时间规则执行job

  • SimpleTrigger:SimpleTrigger 一般用于实现每隔一定时间执行任务,以及重复多少次,如每 2 小时执行一次,重复执行 5 次。SimpleTrigger 内部实现机制是通过计算间隔时间来计算下次的执行时间,这就导致其不适合调度定时的任务。即当有 misfired 的任务并且恢复执行时,该执行时间是随机的(取决于何时执行 misfired 的任务,例如某天的 3:00PM)。这会导致之后每天的执行时间都会变成 3:00PM,而不是我们原来期望的 1:00AM。
  • CronTirgger类似于 LINUX 上的任务调度命令 crontab,即利用一个包含 7 个字段的表达式来表示时间调度方式。对于涉及到星期和月份的调度,CronTirgger 是最适合的
    Cron 表达式包括以下 7 个字段:
    秒、分、小时、月内日期、月、周内日期、年(可选字段)Cron 触发器利用一系列特殊字符:
    反斜线(/)字符表示增量值
    秒字段中“5/15”代表从第 5 秒开始,每 15 秒一次。
    问号(?)字符和字母 L 字符只有在月内日期和周内日期字段中可用。
    问号表示这个字段不包含具体值。所以,如果指定月内日期,可以在周内日期字段中插入“?”,表示周内日期值无关紧要。字母 L 字符是 last 的缩写。放在月内日期字段中,表示安排在当月最后一天执行。在周内日期字段中,如果“L”单独存在,就等于“7”,否则代表当月内周内日期的最后一个实例。所以“0L”表示安排在当月的最后一个星期日执行
    在月内日期字段中的字母(W)字符把执行安排在最靠近指定值的工作日。
    井号(#)字符为给定月份指定具体的工作日实例
    星号(*)字符是通配字符,表示该字段可以接受任何可能的值。
  • DateIntervalTrigger
    其最适合调度类似每 N(1, 2, 3…)小时,每 N 天,每 N 周等的任务。DateIntervalTrigger 不会受到我们上面说到的 misfired 任务的影响,也不会受到 DST(Daylight Saving Time, 即中国的夏令时)调整的影响。
  • NthIncludedDayTrigger
    即用于每隔一个周期的第几天调度任务,例如,每个月的第 3 天执行指定的任务。
    Quartz 中自带了一个线程池的实现:SimpleThreadPool
    配置参数:org.quartz.threadPool.threadCount : 设定线程池的线程数量

任务 job
错过任务 misfire
优点:分布式、灵活
缺点:是一套开发框架、性能未确定、监控使用java api