对分布式任务系统进行初步调研,选择适合项目的开源框架。任务调度器可以被抽象为三类元素:Job、Trigger、Scheduler。
quartz
java实现的工业标准级别的定时任务调度器,常见的、最火的解决方案之一。
maven最后更新时间:2019年10月
并行:concurrent属性默认值为true,作业可并发调度,若为false,则不允许并发调度。
串行:监听器,JobListener、TriggerListener、ScheduleListener
作业:job作为接口,jobDetail作为实现类
触发:一次或固定时间间隔SimpleTrigger,cron表达式CronTrigger
调度:schedule是独立运行容器,通过组和名称定位对象,组是任务分解和执行计划的维度
calendar:节假日等
持久化:Job运行时的所需的数据保存在JobDataMap实例中,可在数据库中持久化,通过11张表配置
已执行结果复用:支持,通过持久化复用进度状态,临时表存储中间结果状态
配置文件:quartz.properties
分布式:通过在quartz.properties进行集群配置,使用数据库协调,QRTZ_LOCKS表进行锁控制
misfire机制:有
API管理:提供调度API,也可与Springboot结合,提供对数据库的管理服务
部署:简易
springboot schedule
简单的定时任务调度器,常用于轻量级的定时的、周期性的夜维或统计类工作。
maven最后更新时间:2020年3月
并行:自定义ThreadPoolTaskScheduler线程池方式支持并行,@Aysnc单个任务非阻塞异步执行(并行+异步)
串行:@schedule多个任务之间串行, @Aysnc单个任务非阻塞异步执行(串行+异步)
作业:自定义任务类
触发:固定时间间隔fixedDelay、固定频率间隔fixedRate、cron表达式
calendar:不支持
持久化:不支持
已执行结果复用:不支持,需自行实现,业务上拆分多阶段,临时表存储中间结果状态
配置文件:application.properties
分布式:不支持
misfire机制:无
API管理:无
部署:简易
Elastic-job-lite
Elastic-job是当当网开源的分布式任务调度解决方案,由Lite和Cloud组成。Elastic-Job-Lite是一个提供分布式作业分片服务的轻量级、无中心方案,Elastic-Job-Cloud是基于Mesos(Apache下的开源分布式资源管理框架,它被称为是分布式系统的内核)的解决方案,提供额外资源管理、应用分发、进程隔离、任务聚合等。所以这里讨论的应该是Elastic-job-lite。
Elastic-Job-Lite将一个任务拆分为多个独立的任务项,然后由分布式的服务器分别执行某一个或几个分片项,开发者需要自行处理分片项与真实数据的对应关系。它并无作业调度中心节点,而是基于部署作业框架的程序在到达相应时间点时各自触发调度,注册中心仅用于作业注册和监控信息存储,而主作业节点仅用于处理分片和清理等功能,可提供最安全的方式执行作业。
maven最后更新时间:2017年7月
并行:支持,且支持单节点运行多个相同的作业实例,以及1主多从的执行
串行:监听器
作业:支持Simple类型作业、Dataflow类型作业、Script类型作业,通过switch case方式实现分片逻辑的独立处理
触发:cron表达式
calendar:不支持
持久化:不支持,需自行用数据库持久化
已执行结果复用:不支持,需自行实现
配置文件:无
分布式:支持,特别是分片机制可提升性能
misfire机制:支持,失效转移,错过执行作业重触发
API管理:支持RESTFUL API
部署:依赖zookeeper
特色:弹性扩缩容,作业分片一致性,自诊断,运维平台,RESTFUL API
cronsun
cronsun是go语言开发的,对Linux服务器的crontab提供统一集中管理,同时提供高可用支持,但需要各执行节点均有全量作业脚本。它使用etcd进行配置和协调,mongodb存储作业结果。csctl提供命令行管理工具,cronweb提供web控制面板的管理节点,cronnode负责执行作业的节点,每台服务器跑一个。
github Release最后更新时间:2018年11月
并行:多作业依据触发可并行执行
串行:不支持,官网明确不支持任务队列,需由作业自行控制
作业:shell脚本方式,普通任务、单机单进程、组级别普通任务(任务组是方便管理的概念)
触发:定时器,cron表达式
calendar:不支持
持久化:任务的stdout和stderr存储到MongoDB,适用小量任务。任务信息在etcd中
已执行结果复用:不支持
配置文件:base.json、web.json、db.json、etcd.json、mail.json、security.json
分布式:支持,通过组进行管理
misfire机制:支持,对失败任务进行重试
API管理:不支持
部署:依赖MongoDB、Etcd3
特色:支持邮件告警
saturn
saturn(土星)是唯品会开源的一个分布式任务调度平台,做到全域统一配置,统一监控,任务高可用以及分片并发处理,是在当当开源的Elastic Job基础上改良而成。亮点之一是基于时间的作业调度,作业实现不受开发语言所限。Saturn包含Saturn Console和Saturn Executor。Saturn Console是调度系统,将作业任务分配到各Executor,同时负责系统配置、报表展现。Saturn Executor是执行作业脚本和代码的Worker。
maven最后更新时间:2020年2月
并行:并行执行加分片
串行:监听器
作业:支持java和shell(System.exec()去调用脚本/程序)
触发:cron表达式,console调度
calendar:不支持
持久化:mysql存储作业配置及配置历史,系统配置,以及namespace及zk集群信息等等
已执行结果复用:
配置文件:saturn.properties
分布式:支持,console支持集群部署,还有分片机制
misfire机制:异常检测和自动failover
API管理:应该支持
部署:内嵌ZooKeeper、内嵌Saturn-Console、内嵌Saturn-Executor(包含了一个Java作业的实现),mysql
特色:基于web的管理,容器友好,统计数据,基于时间的作业调度,作业实现不受开发语言所限,监控,多活集群部署,经受住生产每日几十亿级别的调度考验,支持作业高可用和智能负载均衡,不建议嵌入式使用
xxl-job
xxl-job是一个由个人开发的分布式任务调度平台,xxl即许雪里。它包含“调度中心”的公共平台和“执行器”,调度中心完成任务的调度,而执行器只负责执行,功能较丰富,推荐使用Springboot管理执行器。
github Release最后更新时间:2020年4月
Airflow
Airflow是Airbnb内部发起并开源的一个ETL管理平台,使用Python编写实现的任务管理、调度、监控工作流平台。Airflow使用 DAG (有向无环图) 来定义工作流,使用Operators定义了实际需要执行的作业。图形化功能丰富,可以查看当前调度任务的依赖关系。需使用python语言开发脚本,但支持多种类型的作业。
github Release最后更新时间:2020年4月
Azkaban
Azkaban是由LinkedIn创建的一个批处理工作流,用于跑Hadoop的Jobs。分为WebServer和ExecutorServer,使用mysql做状态的存储。作业可通过工作流flow控制依赖关系,以command调度作业。3种运行模式,solo server mode,two server mode,multiple executor mode。