分布式作业调度框架——ElasticJob

1、简介

ElasticJob 是面向互联网生态和海量任务的分布式调度解决方案,由两个相互独立的子项目 ElasticJob-Lite 和 ElasticJob-Cloud 组成。 它通过弹性调度、资源管控、以及作业治理的功能,打造一个适用于互联网场景的分布式调度解决方案,并通过开放的架构设计,提供多元化的作业生态。 它的各个产品使用统一的作业 API,开发者仅需一次开发,即可随意部署。

1.1、发展历程

Elastic job是当当网架构师张亮,曹昊和江树建等基于Zookepper、Quartz开发并开源的一个Java分布式定时任务,解决了Quartz不支持分布式的弊端。Elastic job主要的功能有支持弹性扩容,通过Zookepper集中管理和监控job,支持失效转移等,这些都是Quartz等其他定时任务无法比拟的。

在经过 alpha、beta、RC1 版本的打磨后, ElasticJob 3.0.0 版本正式发布!这是 ElasticJob 项目自 2020 年 5 月 28 日重启并成为 Apache ShardingSphere 子项目以来的第一个正式版本。

1.2、开源协议

ElasticJob 已于 2020 年 5 月 28 日成为 Apache ShardingSphere 的子项目。

2、功能列表

2.1、弹性调度

  • 支持任务在分布式场景下的分片和高可用
  • 能够水平扩展任务的吞吐量和执行效率
  • 任务处理能力随资源配备弹性伸缩

2.2、资源分配

  • 在适合的时间将适合的资源分配给任务并使其生效
  • 相同任务聚合至相同的执行器统一处理
  • 动态调配追加资源至新分配的任务

2.3、资源分配

  • 在适合的时间将适合的资源分配给任务并使其生效
  • 相同任务聚合至相同的执行器统一处理
  • 动态调配追加资源至新分配的任务

2.4、作业治理

  • 失效转移
  • 错过作业重新执行
  • 自诊断修复

2.5、作业依赖(TODO)

  • 基于有向无环图(DAG)的作业间依赖
  • 基于有向无环图(DAG)的作业分片间依赖

2.6、作业开放生态

  • 可扩展的作业类型统一接口
  • 丰富的作业类型库,如数据流、脚本、HTTP、文件、大数据等
  • 易于对接业务作业,能够与 Spring 依赖注入无缝整合

2.7、可视化管控端

  • 作业管控端
  • 作业执行历史数据追踪
  • 注册中心管理

3、架构设计及原理

3.1、架构设计

分布式作业调度框架——ElasticJob_第1张图片
定位为轻量级无中心化解决方案,使用 jar 的形式提供分布式任务的协调服务。

3.2、功能原理

3.2.1、调度模型

进程内调度:ElasticJob-Lite 是面向进程内的线程级调度框架。通过它,作业能够透明化的与业务应用系统相结合。 它能够方便的与 Spring 、Dubbo 等 Java 框架配合使用,在作业中可自由使用 Spring 注入的 Bean,如数据源连接池、Dubbo 远程服务等,更加方便的贴合业务开发。

3.2.2、弹性调度

弹性调度是 ElasticJob 最重要的功能,也是这款产品名称的由来。 它是一款能够让任务通过分片进行水平扩展的任务处理系统。

弹性调度是 ElasticJob 最重要的功能,也是这款产品名称的由来。 它是一款能够让任务通过分片进行水平扩展的任务处理系统。

任务的分布式执行,需要将一个任务拆分为多个独立的任务项,然后由分布式的服务器分别执行某一个或几个分片项。举例说明,如果作业分为 4 片,用两台服务器执行,则每个服务器分到 2 片,分别负责作业的 50% 的负载,如下图所示。

分布式作业调度框架——ElasticJob_第2张图片
ElasticJob-Lite 实现原理:
ElasticJob-Lite 并无作业调度中心节点,而是基于部署作业框架的程序在到达相应时间点时各自触发调度。 注册中心仅用于作业注册和监控信息存储。而主作业节点仅用于处理分片和清理等功能。
弹性分布式实现:

  • 第一台服务器上线触发主服务器选举。主服务器一旦下线,则重新触发选举,选举过程中阻塞,只有主服务器选举完成,才会执行其他任务。
  • 某作业服务器上线时会自动将服务器信息注册到注册中心,下线时会自动更新服务器状态。
  • 主节点选举,服务器上下线,分片总数变更均更新重新分片标记。
  • 定时任务触发时,如需重新分片,则通过主服务器分片,分片过程中阻塞,分片结束后才可执行任务。如分片过程中主服务器下线,则先选举主服务器,再分片。
  • 通过上一项说明可知,为了维持作业运行时的稳定性,运行过程中只会标记分片状态,不会重新分片。分片仅可能发生在下次任务触发前。
  • 每次分片都会按服务器IP排序,保证分片结果不会产生较大波动。
  • 实现失效转移功能,在某台服务器执行完毕后主动抓取未分配的分片,并且在某台服务器下线后主动寻找可用的服务器执行任务。

4、集成方案

ElasticJob-Lite 支持原生 Java、Spring Boot Starter 和 Spring 自定义命名空间 3 种使用方式。
基于 ElasticJob Spring Boot Starter 使用 ElasticJob ,用户无需手动创建 CoordinatorRegistryCenter、JobBootstrap 等实例, 只需实现核心作业逻辑并辅以少量配置,即可利用轻量、无中心化的 ElasticJob 解决分布式调度问题。

你可能感兴趣的:(架构之道,#,分布式,分布式)