基本需求:
- 调度方法是否丰富,满足常规和特殊需求
- 任务组合和任务依赖
- 分布式(容灾能力)
- 状态监控(集成)
- 性能(高频率调度)
几款任务调度框架
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