# elastic-job
**Repository Path**: rocketdemo/elastic-job
## Basic Information
- **Project Name**: elastic-job
- **Description**: No description available
- **Primary Language**: Java
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2017-03-25
- **Last Updated**: 2020-12-19
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
##Elastic-Job - distributed scheduled job solution
# [English](README.md)
# [原1.x版本文档](README_1.x.md)
[](http://www.apache.org/licenses/LICENSE-2.0.html)
[](https://maven-badges.herokuapp.com/maven-central/com.dangdang/elastic-job)
[](https://travis-ci.org/dangdangdotcom/elastic-job)
[](https://coveralls.io/github/dangdangdotcom/elastic-job?branch=master)
# 概览
Elastic-Job是一个分布式调度解决方案,由两个相互独立的子项目Elastic-Job-Lite和Elastic-Job-Cloud组成。
Elastic-Job-Lite定位为轻量级无中心化解决方案,使用jar包的形式提供分布式任务的协调服务。
Elastic-Job-Cloud使用Mesos + Docker(TBD)的解决方案,额外提供资源治理、应用分发以及进程隔离等服务。
Elastic-Job-Lite和Elastic-Job-Cloud提供同一套API开发作业,开发者仅需一次开发,即可根据需要以Lite或Cloud的方式部署。
# 为何使用Elastic-Job?
## 通用部分
### 1. 分片概念
任务的分布式执行,需要将一个任务拆分为n个独立的任务项,然后由分布式的服务器分别执行某一个或几个分片项。
例如:有一个遍历数据库某张表的作业,现有`2`台服务器。为了快速的执行作业,那么每台服务器应执行作业的`50%`。
为满足此需求,可将作业分成`2`片,每台服务器执行`1`片。作业遍历数据的逻辑应为:服务器`A`遍历`ID`以奇数结尾的数据;服务器`B`遍历`ID`以偶数结尾的数据。
如果分成`10`片,则作业遍历数据的逻辑应为:每片分到的分片项应为`ID%10`,而服务器A被分配到分片项`0,1,2,3,4`;服务器B被分配到分片项`5,6,7,8,9`,直接的结果就是服务器`A`遍历`ID`以`0-4`结尾的数据;服务器`B`遍历`ID`以`5-9`结尾的数据。
### 2. 分片项与业务处理解耦
`Elastic-Job`并不直接提供数据处理的功能,框架只会将分片项分配至各个运行中的作业服务器,开发者需要自行处理分片项与真实数据的对应关系。
### 3. 个性化参数的适用场景
个性化参数即`shardingItemParameter`,可以和分片项匹配对应关系,用于将分片项的数字转换为更加可读的业务代码。
例如:按照地区水平拆分数据库,数据库`A`是北京的数据;数据库`B`是上海的数据;数据库`C`是广州的数据。
如果仅按照分片项配置,开发者需要了解`0`表示北京;`1`表示上海;`2`表示广州。
合理使用个性化参数可以让代码更可读,如果配置为`0=北京`,`1=上海`,`2=广州`,那么代码中直接使用北京,上海,广州的枚举值即可完成分片项和业务逻辑的对应关系。
## Elastic-Job-Lite
### 1. 分布式调度
`Elastic-Job-Lite`并无作业调度中心节点,而是基于部署作业框架的程序在到达相应时间点时各自触发调度。
注册中心仅用于作业注册和监控信息存储。而主作业节点仅用于处理分片和清理等功能。
### 2. 作业高可用
`Elastic-Job-Lite`提供最安全的方式执行作业。将分片总数设置为`1`,并使用多于`1`台的服务器执行作业,作业将会以`1`主`n`从的方式执行。
一旦执行作业的服务器崩溃,等待执行的服务器将会在下次作业启动时替补执行。开启失效转移功能效果更好,可以保证在本次作业执行时崩溃,备机立即启动替补执行。
### 3. 最大限度利用资源
`Elastic-Job-Lite`也提供最灵活的方式,最大限度的提高执行作业的吞吐量。将分片项设置为大于服务器的数量,最好是大于服务器倍数的数量,作业将会合理的利用分布式资源,动态的分配分片项。
例如:`3`台服务器,分成`10`片,则分片项分配结果为服务器`A=0,1,2`;服务器`B=3,4,5`;服务器`C=6,7,8,9`。
如果服务器`C`崩溃,则分片项分配结果为服务器`A=0,1,2,3,4`;服务器`B=5,6,7,8,9`。在不丢失分片项的情况下,最大限度的利用现有资源提高吞吐量。
## Elastic-Job-Cloud
### 1. 分布式调度
`Elastic-Job-Cloud`采用`Mesos Framework`分片和协调作业调度。采用中心化调度实现难度小于`Elastic-Job-Lite`的无中心化调度,无需再考虑多线程并发的情况。
### 2. 作业高可用
`Elastic-Job-Cloud`由`Mesos Framework`负责作业高可用和分片。作业丢失会由`Mesos Framework`自动在另外的`Agent`上重新启动作业分片实例。
### 3. 弹性资源利用
`Elastic-Job-Cloud`分为`2`种作业运行模式:瞬时作业 和 常驻作业。
瞬时作业会在每一次作业执行完毕后立刻释放资源,保证利用现有资源错峰执行。资源分配和容器启动均占用一定时长,且作业执行时资源不一定充足,因此作业执行会有延迟。瞬时作业适用于间隔时间长,资源消耗多且对执行时间无严格要求的作业。
常驻作业无论在运行时还是等待运行时,均一直占用分配的资源,可节省过多容器启动和资源分配的开销,适用于间隔时间短,资源需求量稳定的作业。
# 功能列表
## 1. Elastic-Job-Lite
* 分布式调度协调
* 弹性扩容缩容
* 失效转移
* 错过执行作业重触发
* 作业分片一致性,保证同一分片在分布式环境中仅一个执行实例
* 支持并行调度
* 支持作业声明周期操作
* 丰富的作业类型
* Spring整合以及命名空间提供
* 运维平台
## 2. Elastic-Job-Cloud
* 包含Elastic-Job-Lite的全部功能
* 应用自动分发
* 基于Fenzo的弹性资源分配
* 基于Docker的进程隔离(TBD)
***
# [Roadmap](ROADMAP.md)
# [Release Notes](http://dangdangdotcom.github.io/elastic-job/post/release_notes/)
# Architecture
## Elastic-Job-Lite

***
## Elastic-Job-Cloud

# Quick Start
## Elastic-Job-Lite
### 引入maven依赖
```xml
com.dangdang
elastic-job-lite-core
${latest.release.version}
com.dangdang
elastic-job-lite-spring
${latest.release.version}
```
### 作业开发
```java
public class MyElasticJob implements SimpleJob {
@Override
public void execute(ShardingContext context) {
switch (context.getShardingItem()) {
case 0:
// do something by sharding item 0
break;
case 1:
// do something by sharding item 1
break;
case 2:
// do something by sharding item 2
break;
// case n: ...
}
}
}
```
### 作业配置
```xml
```
***
## Elastic-Job-Cloud
### 引入maven依赖
```xml
com.dangdang
elastic-job-cloud-executor
${latest.release.version}
```
### 作业开发
同`Elastic-Job-Lite`
### 作业APP配置
```shell
curl -l -H "Content-type: application/json" -X POST -d
'{"appName":"yourAppName","appURL":"http://app_host:8080/foo-job.tar.gz","cpuCount":0.1,"memoryMB":64.0,"bootstrapScript":"bin/start.sh","appCacheEnable":true}'
http://elastic_job_cloud_host:8899/app
```
### 作业配置
```shell
curl -l -H "Content-type: application/json" -X POST -d
'{"jobName":"fooJob","appName":"yourAppName","jobClass":"yourJobClass","jobType":"SIMPLE","jobExecutionType":"TRANSIENT","cron":"0/5 * * * * ?","shardingTotalCount":5,"cpuCount":0.1,"memoryMB":64.0,"failover":true,"misfire":true}'
http://elastic_job_cloud_host:8899/job/register
```
***
# 相关文档
## 1. Elastic-Job-Lite
* [使用指南](http://dangdangdotcom.github.io/elastic-job/post/user_guide/lite/lite_index)
* [实现原理](http://dangdangdotcom.github.io/elastic-job/post/principles/lite/)
## 2. Elastic-Job-Cloud
* [使用指南](http://dangdangdotcom.github.io/elastic-job/post/user_guide/cloud/cloud_index)
* 实现原理(TBD)
## 3. [FAQ](http://dangdangdotcom.github.io/elastic-job/post/faq/)
## 4. [采用公司](http://dangdangdotcom.github.io/elastic-job/post/companies_using/)
## 5. [其他第三方文档](http://dangdangdotcom.github.io/elastic-job/post/third_parties_docs/)
**讨论QQ群:**430066234(不限于Elastic-Job,包括分布式,定时任务相关以及其他互联网技术交流。由于QQ群已接近饱和,我们希望您在申请加群之前仔细阅读文档,并在加群申请中正确回答问题,以及在申请时写上您的姓名和公司名称。并且在入群后及时修改群名片。否则我们将有权拒绝您的入群申请。谢谢合作。)