简介
Saturn (任务调度系统)是唯品会开源的一个分布式任务调度平台,取代传统的Linux Cron/Spring Batch Job的方式,做到全域统一配置,统一监控,任务高可用以及分片并发处理。
Saturn是在当当开源的Elastic Job基础上,结合各方需求和我们的实践见解改良而成。
本文档针适用于3.x版本。
重要特性
- 支持多种语言作业,语言无关(Java/Go/C++/PHP/Python/Ruby/shell)
- 支持秒级调度
- 支持作业分片并行执行
- 支持依赖作业串行执行
- 支持作业高可用和智能负载均衡
- 支持异常检测和自动失败转移
- 支持异地容灾
- 支持多个集群部署
- 支持跨机房区域部署
- 支持弹性动态扩容
- 支持优先级和权重设置
- 支持docker容器,容器化友好
- 支持cron时间表达式
- 支持多个时间段暂停执行控制
- 支持超时告警和超时强杀控制
- 支持灰度发布
- 支持异常、超时和无法高可用作业监控告警和简易的故障排除
- 支持失败率最高、最活跃和负荷最重的各域各节点TOP10的作业统计
- 经受住唯品会生产800多个节点,每日10亿级别的调度考验
快速开始
Saturn包括两大部分,Saturn Console和Saturn Executor。
Saturn Console是一个GUI,用于作业/Executor管理,统计报表展现,系统配置等功能。它同时也是整个调度系统的大脑:将作业任务分配到各Executor。
Saturn Executor是执行任务的Worker:按照作业配置的要求去执行部署于Executor所在容器或物理机当中的作业脚本和代码。
为了能让用户对Saturn有一个感性认识,我们提供了两种快速启动Console和Executor的方法。
至于生产环境的部署,请参见后面的部署指南。
1 一键启动
首先,请确保本机安装了以下软件:
- JDK 7 or JDK 8
- Maven 3.0.4+
- node.js 8.7.0+
- npm 5.4.2+
- docker (版本不限)
然后,git clone本仓库到本地,checkout对应版本分支,进入quickstart目录。如果是Windows系统,请运行quickstart.bat,如果是Linux/Unix/MacOS系统,请运行quickstart.sh。
$ git clone https://github.com/vipshop/Saturn$ git checkout develop$ cd saturn-docker$ chmod +x quickstart.sh$ ./quickstart.sh
quickstart脚本将做如下事情:
- 启动内嵌的ZooKeeper
- 启动内嵌的Saturn-Console
- 启动内嵌的Saturn-Executor(包含了一个Java作业的实现)
- 在Saturn-Console添加该Java作业
启动完成后,您可以访问Saturn-Console:http://localhost:9088
如果你见到如下界面,则恭喜你,你的console已经启动。
在首页的search bar点击会出现一个叫做'mydomain'的namespace。点击进去会见到一个名为'demoJavaJob'的作业,该作业有5个分片,每隔5秒调度一次。
一个叫做'executor-1'的executor执行器调度该作业。
2 Docker启动
$ git clone https://github.com/vipshop/Saturn$ git checkout develop$ cd saturn-docker$ chmod +x quickstart-docker.sh$ ./quickstart-docker.sh
quickstart-docker.sh脚本将做如下事情:
- 构建基于OpenJDK7的基础镜像
- 构建基于OpenJDK7的Saturn-Console镜像
- 构建基于OpenJDK7的Saturn-Executor镜像
- 启动一个ZooKeeper集群的容器
- 启动一个Saturn-Console容器
- 启动两个Saturn-Executor容器
- 添加一个Java作业和一个Shell作业
开发你的作业
这一节想介绍如何开发你的作业,包括Java和Shell两种类型,并使用你熟悉的IDE进行调试。
但要注意的是,作业开发完需要将其部署到Executor才能真正的工作。
关于如何部署,见“部署 Saturn Executor”一节。
0 前置条件
确保你已经部署好Saturn Console。如果没有,请参见“部署Saturn Console”一节。
1 开发Java作业
1.1 添加maven依赖
在pom.xml添加dependency
com.vip.saturn saturn-job-api master-SNAPSHOT
以及plugin
com.vip.saturn saturn-plugin master-SNAPSHOT
1.2 开发第一个Java作业
修改现在类或者增加一个新的类,继承自AbstractSaturnJavaJob ,实现 handleJavaJob方法。
public class DemoJob extends AbstractSaturnJavaJob { @Override public SaturnJobReturn handleJavaJob(final String jobName, final Integer shardItem, final String shardParam, final SaturnJobExecutionContext context) { // do what you want here ... // 返回一个SaturnJobReturn对象,默认返回码是200表示正常的返回 return new SaturnJobReturn("我是分片"+shardItem+"的处理结果"); } }
handleJavaJob方法是作业调用主入口,当调度周期到达时,Saturn会调用该方法。
传入参数如下:
- jobName:作业名
- shardItem:分片编号(从0开始)分片参数(在Console配置)
- shardParam:分片参数(在Console配置)
- context:调用上下文