JobScheduler是elastic-job作业调度的关键类,也是起始类,在包com.dangdang.ddframe.job.lite.api下。调度任务的执行需要包含两大步骤:任务的配置和任务的注册。JobScheduler的构造函数除了任务配置和注册相关信息之外还有事件和监听。后两者是elastic-job的扩展功能,我们后续再介绍。

任务的配置

由于内部使用quartz作为任务调度框架,任务的配置的相关的基础信息也是和quartz一致的。elastic-job的任务配置类在quartz的基础上(执行方法,cron表达式等)额外封装了分片策略,监控作业相关参数以及与注册中心的时间误差秒数等配置项。

任务的注册

elastic-job是通过zookeeper进行任务协调和故障转移的,任务的注册也就是把任务注册到zookeeper里面去。任务的注册包含在任务的启动过程中。根节点是项目的名称,下面一级是任务的名称。任务一旦创建则不能修改任务的名称,如果修改名称将视为新的任务,创建新的节点。任务名称节点下又包含5个数据子节点,分别是config, instances, leader, servers和sharding。如下图:

1. config节点:

任务的配置信息,包含执行类,cron表达式,分片算法类,分片数量,分片参数等等。config节点的数据是通过ConfigService持久化到zookeeper中去的。默认状态下,如果你修改了Job的配置比如cron表达式,分片数量等是不会更新到zookeeper上去的,除非你把参数overwrite修改成true。

2. instances节点:

同一个Job下的elastic-job的部署实例。一台机器上可以启动多个Job实例,也就是Jar包。instances的命名是IP+@-@+PID

3. leader节点:

任务实例的主节点信息,通过zookeeper的主节点选举,选出来的主节点信息。下面的子节点分为electionsharding和failover三个子节点。分别用于主节点选举,分片和失效转移处理。election下面的instance节点显式了当前主节点的实例ID:jobInstanceId。latch节点也是一个永久节点用于选举时候的实现分布式锁。sharding节点下面有一个临时节点,necessary,是否需要重新分片的标记。如果分片总数变化,或任务实例节点上下线或启用/禁用,以及主节点选举,都会触发设置重分片标记,主节点会进行分片计算。

4. servers节点:

任务实例的信息,主要是IP地址,任务实例的IP地址。如果多个任务实例在同一台机器上运行则只会出现一个IP子节点。可在IP地址节点写入DISABLED表示该任务实例禁用。 在新的cloud native架构下,servers节点大幅弱化,仅包含控制服务器是否可以禁用这一功能。为了更加纯粹的实现job核心,servers功能未来可能删除,控制服务器是否禁用的能力应该下放至自动化部署系统。

5. sharding节点:

任务的分片信息,子节点是分片项序号,从零开始,至分片总数减一。分片个个数是在任务配置中设置的。分片项序号的子节点存储详细信息。每个分片项下的子节点用于控制和记录分片运行状态。最主要的子节点就是instance。举例来说,上图有三个分片,每个分片下面有个instance的节点,也就说明了这个分片在哪个instance上运行。如上文所说如果分片总数变化,或任务实例节点上下线或启用/禁用,以及主节点选举,都会触发设置重分片标记,主节点会进行分片计算。分片计算的结果也就体现在这instance上。

上文介绍的节点信息并不全面,还有一些会在特定的情况下出现的临时节点,更多详细的介绍可以请参看官方文档:http://dangdangdotcom.github.io/elastic-job/elastic-job-lite/03-design/lite-design/

任务的启动

任务的启动过程,就是任务实例和zookeeper进行交互的过程。每个实例在启动过程中,会把自身的信息注册到zookeeper中去。并完成选举和分片策略的设置,也就是完成上文一些zookeeper节点的创建和持久化。

整个启动的过程都在JobScheduler.init()方法中完成。其中最重要的方法registerStartUpInfo完成了监听,选举持久化数据,以及设置分片标志位(为了任务执行是主节点进行分片算法)等工作。init()方法中完成了配置和注册之后,相关的参数被传递给了JobScheduleController类,这个类就是quartz的封装。之前配置的任务执行类和cron表达式被转换成JobDetail和Trigger这两个quartz的类,然后通过quartz的scheduler.start触发任务。等待任务的执行。

整体流程图如下:

任务的执行

任务的执行依赖于quartz job的触发。elastic-job的LiteJob类继承自quartz的Job类,在任务触发的时候,添加额外的逻辑处理。LiteJob的执行器AbstractElasticJobExecutor有两个具体的实现,SimpleJobExecutor和DataflowJobExecutor,各自执行SimpleJob和DataflowJob两种Job类型。Job触发的时候,SimpleJobExecutor或者DataflowJobExecutor会被new一次,重新从缓存中加载Job配置并执行。

LiteJob把任务的执行分为执行前,执行(业务代码的执行),和执行后三个阶段。在执行前阶段中主要实现分片策略的执行(shardingIfNecessary方法),记录事件,执行监听事件等等。而执行后阶段主要处理错过执行的相关任务以及执行监听事件。

整个执行流程图如下:

elastic-job详解(二):作业的调度的更多相关文章

  1. pika详解(二) BlockingConnection

    pika详解(二) BlockingConnection   本文链接:https://blog.csdn.net/comprel/article/details/94592348 版权 Blocki ...

  2. .NET DLL 保护措施详解(二)关于性能的测试

    先说结果: 加了缓存的结果与C#原生代码差异不大了 我对三种方式进行了测试: 第一种,每次调用均动态编译 第二种,缓存编译好的对象 第三种,直接调用原生C#代码 .net dll保护系列 ------ ...

  3. PopUpWindow使用详解(二)——进阶及答疑

      相关文章:1.<PopUpWindow使用详解(一)——基本使用>2.<PopUpWindow使用详解(二)——进阶及答疑> 上篇为大家基本讲述了有关PopupWindow ...

  4. Android 布局学习之——Layout(布局)详解二(常见布局和布局参数)

    [Android布局学习系列]   1.Android 布局学习之——Layout(布局)详解一   2.Android 布局学习之——Layout(布局)详解二(常见布局和布局参数)   3.And ...

  5. logback -- 配置详解 -- 二 -- <appender>

    附: logback.xml实例 logback -- 配置详解 -- 一 -- <configuration>及子节点 logback -- 配置详解 -- 二 -- <appen ...

  6. 爬虫入门之urllib库详解(二)

    爬虫入门之urllib库详解(二) 1 urllib模块 urllib模块是一个运用于URL的包 urllib.request用于访问和读取URLS urllib.error包括了所有urllib.r ...

  7. [转]文件IO详解(二)---文件描述符(fd)和inode号的关系

    原文:https://www.cnblogs.com/frank-yxs/p/5925563.html 文件IO详解(二)---文件描述符(fd)和inode号的关系 ---------------- ...

  8. Android View 的绘制流程之 Layout 和 Draw 过程详解 (二)

    View 的绘制系列文章: Android View 的绘制流程之 Measure 过程详解 (一) Android View 绘制流程之 DecorView 与 ViewRootImpl 在上一篇  ...

  9. HTTPS详解二:SSL / TLS 工作原理和详细握手过程

    HTTPS 详解一:附带最精美详尽的 HTTPS 原理图 HTTPS详解二:SSL / TLS 工作原理和详细握手过程 在上篇文章HTTPS详解一中,我已经为大家介绍了 HTTPS 的详细原理和通信流 ...

  10. Linux dts 设备树详解(二) 动手编写设备树dts

    Linux dts 设备树详解(一) 基础知识 Linux dts 设备树详解(二) 动手编写设备树dts 文章目录 前言 硬件结构 设备树dts文件 前言 在简单了解概念之后,我们可以开始尝试写一个 ...

随机推荐

  1. [转] Nodejs 进阶:Express 常用中间件 body-parser 实现解析

    写在前面 body-parser是非常常用的一个express中间件,作用是对post请求的请求体进行解析.使用非常简单,以下两行代码已经覆盖了大部分的使用场景. app.use(bodyParser ...

  2. Java基础知识➣多线程编程(五)

    概述 Java 给多线程编程提供了内置的支持.一个多线程程序包含两个或多个能并发运行的部分.程序的每一部分都称作一个线程,并且每个线程定义了一个独立的执行路径.使用多线程也是为了充分的利用服务器资源, ...

  3. 【bzoj4887】[Tjoi2017]可乐 矩阵乘法

    题解: 比较简单的一道题目 如果会倍增floyd这个就很显然的 每次转移看成乘上一个矩阵 另外自爆等同于连到一个特殊点,特殊点只能走自己 停留就是增加自环

  4. vsftp虚拟主机实战

    文件传输协议,基于该协议FTP客户端与服务端可以实现共享文件,上传文件,下载文件.FTP基于TVP协议生成一个虚拟的连接,主要用于控制FTP连接信息,同时再生成一个单独的TCP连接用于FTP数据传输, ...

  5. windows云服务器数据迁移

    刚入职,第一个任务是完成windows腾讯云到windows华为云上的MySQL数据库迁移.之前都是在CentOS上搞,感觉没啥难度,一口答应,没想到各种坑接踵而来.次数不再叙述坑都有哪些了,说说怎么 ...

  6. Codeforces 822E Liar dp + SA (看题解)

    Liar 刚开始感觉只要开个dp[ i ][ j ][ 0 / 1 ]表示处理了s的前 i 个用了 k 段, i 是否是最后一段的最后一个字符 的 t串最长匹配长度, 然后wa24, 就gg了.感觉这 ...

  7. 关系网络数据可视化:1. 关系网络图&Gephi

    1.关系网络图 如何来表示两个对象之间的关系? 把对象变成点,点的大小.颜色可以是它的两个参数,两个点之间的关系可以用连线来表示.连线分为无向(只是连接的导向,一些简单的关系很容易体现)和有向(复杂网 ...

  8. Web界面实现数据库增删改查过程

    实现方法:JSP+Servlet+JavaBean 基本实现思想:jsp文件为显示界面,包括增删改查四个界面,然后使用form或者href超链接的方法将网页获得的值传到Servlet中的方法里:而se ...

  9. pacman 命令

    安装 pacman -S  删除 pacman -R  移除已安装不需要软件包 pacman -Rs  删除一个包,所有依赖 pacman -Rsc  升级包 pacman -Syu  查询包数据库 ...

  10. 006.Ceph对象存储基础使用

    一 Ceph文件系统 1.1 概述 Ceph 对象网关是一个构建在 librados 之上的对象存储接口,它为应用程序访问Ceph 存储集群提供了一个 RESTful 风格的网关 . Ceph 对象存 ...