elastic job

作业(定时任务)的必要性

  • 时间/事件驱动

爬虫等外部系统,只能时间驱动,不能像内部系统一样发送事件,触发事件

  • 逐条/批量

只能批处理的业务逻辑,比消息中间件更有优势 : 一月与外部结算一次,量多有返利

  • 实时/非实时

vip 用户降级

常见作业系统问题

  • Quartz

Java事实上的定时任务标准,关注定时任务,无根据数据处理而定制化的流程

仅基于 DB 实现作业高可用(HA),缺少分布式并行调度(水平扩展)

  • TBSchedule

代码陈旧,使用timer(异常处理有缺陷)而非线程池执行任务

  • Crontab

缺乏分布式和集中管理

Elastic Job 1.X

  • 高可用(主从热备)

主失效,从选举成为主继续服务,原主恢复后作为从继续等待选举机会

  • 线性扩展

高可用的高阶功能,避免资源浪费

主备调整为分片,提升处理能力

1.X 无中心化架构,无调度中心,各执行节点通过 zk 选举主节点进行分片、清理等动作,作业由执行节点自行触发

通过分片进行线性扩展,各执行节点负责处理被分配到的分片项,开发者负责分片项和业务逻辑的对应关系

public class MyElasticJob implements SimpleJob {

    @Override
    public void process(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: ...
        }
    }
}
  • 容错

节点失效重分片、失效转移、错过任务重执行以及分布式场景下的脑裂,网络抖动容错等

  • 异构语言

支持Java和Shell,基本能做到异构语言支持

核心组件

绿色对开发者提供的API

蓝色部分为内部实现

持久化和协调基于 zk

部署架构

1.X与应用代码部署在一起,作为lib提供服务

和运维平台通过注册中心进行交互

Mesos对云平台解决方案的革新

站在巨人的肩膀上,可以更快速稳定的搭建云平台,但需要拥抱革新

目标不是容器化,而是云化,容器是实现云的一种手段,但合理的分布式编排系统更加关键

Docker本身有网络、日志采集等问题需要解决。而Mesos将Docker作为可选容器支持

为了最小化采用新技术带来的风险,将Docker容器化推迟,先将Elastic Job迁移至Mesos,以后加入对Docker的支持非常容易

Elastic-Job 2.x

2个独立子项目 Elastic-Job-Lite/Cloud

1.x 高可用、分片、分布式协调(失效转移)较完整。但去中心化的作业管理较为散乱,容易造成资源浪费

Elastic-Job-Cloud以私有云平台的方式提供集资源、调度以及分片为一体的全量级解决方案,依赖Mesos和Zk。额外提供资源治理、应用分发以及进程隔离等服务

从功能上看Elastic-Job-Cloud更加完善,但依托于Mesos,使用复杂度较高,不易整合进公司现有系统,更轻量级的Elastic-Job-Lite在实际使用中更受青睐

关键更新

  • 单服务器可运行任意多的相同作业实例。Cloud Native
  • 自修复能力使稳定性进一步提升

原版本网络不稳定时可能选主卡死,或某个分片不运行,通过重启应用修复

新版本Elastic-Job-Lite用异步线程,定期(可配间隔)检测集群中不正确的状态,以反向检查的方式查找并自动修复分布式的不一致,为分布式稳定性的完善增加了最后一块拼图

  • 作业操作梳理

操作分为作业、实例、分片以及服务器4个维度,去除容易混淆的暂停操作,禁用功能增强,可从各个维度控制整体作业或独立分片

  • 界面

重写且增加事件追踪界面

兼容性

http://elasticjob.io/docs/elastic-job-lite/01-start/faq/

原作业实例标识由IP地址替换为启动产生的UUID。Cloud Native架构下,作业物理服务器概念大幅弱化

服务器信息以另外一个维度可选的存在于作业管理信息中,使用者仍然可以继续使用服务器静态部署的方式

Elastic-Job-Lite已经可以非常容易的对接Mesos + Marathon以及Kubernetes,可以非常轻松的搭建一个深度定制版的作业私有云

理念

  • 分布式调度

用Mesos 分片和协调作业调度。中心化调度实现难度小于Elastic-Job-Lite的无中心化调度,无需再考虑多线程并发的情况

  • 作业高可用

作业丢失由Mesos 自动在另外的Agent上重新启动作业分片实例

  • 弹性资源利用

2种作业运行模式:瞬时/常驻

Elastic Job Cloud核心组件图

Elastic Job Cloud改造点

核心组件全景图

Demo

public class MyElasticJob implements SimpleJob {
   /xxx   
}

打包作业

tar -cvf yourJobs.tar.gz yourJobs

发布APP

curl -l -H "Content-type: application/json" -X POST -d '{
"appName":"foo_app",
"appURL":"http://app_host:8080/yourJobs.gz",
"cpuCount":0.1,
"memoryMB":64.0,
"bootstrapScript":"bin/start.sh",
"appCacheEnable":true,
"eventTraceSamplingCount":0}'
http://elastic_job_cloud_host:8899/api/app

发布作业

curl -l -H "Content-type: application/json" -X POST -d '{
"jobName":"foo_job",
"jobClass":"yourJobClass",
"jobType":"SIMPLE",
"jobExecutionType":"TRANSIENT",
"cron":"0/5 * * * * ?",
"shardingTotalCount":5,
"cpuCount":0.1,
"memoryMB":64.0,
"appName":"foo_app",
"failover":true,
"misfire":true,
"bootstrapScript":"bin/start.sh"}' 
http://elastic_job_cloud_host:8899/api/job/register

Roadmap

  • Docker支持

  • 任务优先级、依赖以及编排的支持

  • 跨机房部署、物理机隔离

ref

http://elasticjob.io/docs/elastic-job-cloud/00-overview

第三方文档

2017-04 中国技术开放日分享:如何从0到1搭建弹性作业云Elastic-Job-Cloud

2016-11 2016全球容器技术大会分享:基于Mesos的当当作业云Elastic-Job-Cloud

2016-09 InfoQ新闻:基于Mesos的当当作业云Elastic Job Cloud

http://tech.lede.com/2017/06/23/rd/server/elasticJob/