• 工具篇--分布式定时任务springBoot--elasticjob使用--工作流程(2)



    前言

    本文对elasticjob 的工作流程介绍;


    一、工作流程:

    1.1 elasticjob 轻量级无中心化介绍:

    ElasticJob 定位为轻量级无中心化解决方案,使用 jar 的形式提供分布式任务的协调服务。

    在这里插入图片描述

    • app1,app2 表示不同的服务系统,每个系统都可以 引入elasticjob-lite-core jar 进行定时任务的执行

    • elasticjob-lite-core 内部包括,任务执行实例的注册,leader 的选举,任务的调度;在任务调度过程中可以将日志进行保存到 数据库中

    • ELK 可以对保存到数据库中的日志进行分析

    • Console 可以连接到数据读取日志,从而获取到任务执行的轨迹;通过连接zk 可以知晓任务的运行状态,以及对任务的状态进行修改;

    1.2 elasticjob 工作流程:

    ElasticJob 的工作流程可以分为初始化、注册和运行三个主要步骤。以下是 ElasticJob 的工作流程详细步骤:

    1.2.1 初始化:

    • 定义任务:首先,需要定义要执行的任务逻辑,可以是数据处理、代码运行、脚本执行等。
    • 配置任务:配置任务的执行策略、调度规则、分片等信息,可以使用注解或配置文件进行配置。
    • 初始化作业:将任务配置信息注册到作业中心,作业中心会解析这些配置信息,并向 Zookeeper 注册任务信息。

    1.2.2 注册:

    • 作业注册中心:各作业节点将通过 Zookeeper 注册到作业注册中心,注册中心负责协调和管理各个作业节点。
    • 注册作业:作业注册中心将根据配置信息注册任务,包括任务类型、分片信息、触发时间等。

    1.2.3 运行:

    • 调度触发:根据配置的触发规则和调度策略,作业注册中心会触发任务执行。
    • 分片分配:作业节点接收到任务执行指令后,根据分片算法自动分配分片,并启动对应的作业实例。
    • 任务执行:作业节点根据分配的分片,执行相应的任务逻辑,处理数据、执行代码等。
    • 监控日志:作业节点会记录执行日志,并通过监控中心提供运行状态、执行结果等信息。
    • 弹性扩缩容:根据负载情况,作业注册中心会动态调整作业分片的分配,实现弹性扩容和缩容。

    1.2.4 zk 运行 时:

    当任务启动后,会线连接zk;然后创建对应的zk 命名空间(如果命名空间不存在的话);创建任务节点;当任务需要被触发执行时,leader 节点会分配任务到哪些任务实例,然后任务实例接收任务并运行;

    在这里插入图片描述

    • my-job : elasticjob 注册zk 时的命名空间(永久节点);
    • myjob-param: 改zk 命名空间下的 job 任务(永久节点);
    • config: 注册任务的参数信息(包括任务名称,任务分片参数,任务触发的cron 等),以 YAML 格式存储;
    • leader 节点: 作业服务器主节点信息,分为 election,sharding 和 failover 三个子节点。 分别用于主节点选举,分片和失效转移处理;只有主节点可以可以进行任务的分配;
    • servers 节点: 作业服务器信息,子节点是作业服务器的 IP 地址。 可在 IP 地址节点写入 DISABLED 表示该服务器禁用。 在新的云原生架构下,servers 节点大幅弱化,仅包含控制服务器是否可以禁用这一功能。 为了更加纯粹的实现作业核心,servers 功能未来可能删除,控制服务器是否禁用的能力应该下放至自动化部署系统;
    • instances 节点 :作业运行实例信息,子节点是当前作业运行实例的主键。 作业运行实例主键由作业运行服务器的 IP 地址和 PID 构成。 作业运行实例主键均为临时节点,当作业实例上线时注册,下线时自动清理。注册中心监控这些节点的变化来协调分布式作业的分片以及高可用。 可在作业运行实例节点写入 TRIGGER 表示该实例立即执行一次;
    • sharding 节点 :作业分片信息,子节点是分片项序号,从零开始,至分片总数减一。 分片项序号的子节点存储详细信息。每个分片项下的子节点用于控制和记录分片运行状态;

    1.2.5 job 执行:

    在这里插入图片描述

    在 ElasticJob 中,任务的触发执行过程主要包括以下详细流程:

    • 触发条件满足:根据任务的触发规则(如定时触发、手动触发等),当触发条件满足时,主节点会向作业节点发送触发任务执行的指令。

    • 任务分片分配:作业节点接收到触发指令后,根据分片算法将任务分配给各个作业实例执行。每个作业实例负责执行其中一个或多个分片的任务数据。

    • 任务执行:作业实例在接收到分片后,开始执行具体的任务逻辑。任务逻辑可以是数据处理、代码执行、脚本执行等,根据任务的配置和处理逻辑进行具体的执行操作。

    • 监控日志记录:作业实例在执行任务过程中会记录执行日志,包括任务的执行情况、运行状态、执行结果等信息。这些日志可以帮助监控中心跟踪任务的执行情况。

    • 弹性扩缩容:在任务执行过程中,如果系统负载增加或减少,主节点会根据配置的策略动态调整任务分片的分配情况,实现任务的弹性扩容和缩容。

    • 结果处理:任务执行完成后,作业实例会将执行结果上报给主节点,并根据结果进行相应的处理,如通知用户、触发后续操作等。

    总体来说,ElasticJob 的任务触发执行流程非常灵活和可靠,能够根据配置的规则和策略准确地触发、分配和执行任务。

    1.3 elasticjob 高可用:

    当作业服务器在运行中宕机时,注册中心同样会通过临时节点感知,并将在下次运行时将分片转移至仍存活的服务器,以达到作业高可用的效果。 本次由于服务器宕机而未执行完的作业,则可以通过失效转移的方式继续执行。如下图所示

    在这里插入图片描述
    将分片总数设置为 1,并使用多于 1 台的服务器执行作业,作业将会以 1 主 n 从的方式执行。 一旦执行作业的服务器宕机,等待执行的服务器将会在下次作业启动时替补执行。开启失效转移功能效果更好,如果本次作业在执行过程中宕机,备机会立即替补执行。

    二、elasticjob zk 选举:

    2.1 elasticjob zk 选举过程:

    每个Elastic-Job的任务执行实例作为ZooKeeper的客户端来操作ZooKeeper的znode

    • 任意一个实例启动时首先创建一个 /server 的PERSISTENT节点;
    • 多个实例同时创建 /server/eader EPHEMERAL子节点3)/server/leader子节点
    • 只能创建一个,后创建的会失败。创建成功的实例被选为leader节点,用来执行任务
    • 所有任务实例监听 /server/leader 的变化,一旦节点被删除,就重新进行选举,抢占式地创建 /server/leader节点,谁创建成功谁就是leader。

    2.2 elasticjob 主节点的作用:

    在 ElasticJob 中,主节点的作用主要包括以下几个方面:

    • 协调任务调度:主节点负责协调任务的调度和执行,通过与 Zookeeper 交互实现任务的分配和调度。

    • 分片调度:主节点会根据任务的配置信息和分片策略,将任务分配给不同的作业节点执行,确保任务能够顺利地分片执行。

    • 监控和管理:主节点负责监控整个任务系统的运行状态,包括作业节点的健康状态、任务执行情况、运行日志等,并提供管理界面供用户查看和管理任务。

    • 弹性扩缩容:主节点会根据任务的负载情况和配置的策略,动态调整任务的分片大小,实现任务的弹性扩容和缩容。

    • 故障处理:主节点还负责处理作业节点的故障情况,例如重新分配故障节点上的任务分片,确保任务能够正常运行并保证数据处理的准确性。

    三、elasticjob 分片:

    3.1 分片理解:

    作业分片是指任务的分布式执行,需要将一个任务拆分为多个独立的任务项,然后由分布式的应用实例分别执行某一个或几个分片项。
    例如:Elastic-Job快速入门中文件备份的例子,现有2台服务器,每台服务器分别跑一个应用实例。为了快速的执行作业,那么可以将作业分成4片,每个应用实例个执行2片。作业遍历数据的逻辑应为:实例1查找text和image类型文件执行备份;
    实例2查找radio和vedio类型文件执行备份。
    如果由于服务器扩容应用实例数量增加为4,则作业遍历数据的逻辑应为:4个实例分别处理text、image、radio、video类型的文件。
    可以看到,通过对任务合理的分片化,从而达到任务并行处理的效果,最大限度的提高执行作业的吞吐量。

    3.2 分片项与业务处理解耦:

    分片项与业务处理解耦:
    Elastic-job并不直接提供数据处理的功能,框架只会将分片项分配至各个运行中的作业服务器,开发者需要自行处理分片项与真实数据的对应关系。
    最大限度利用资源:
    将分片项设置为大于服务器的数量,最好是大于服务器倍数的数量,作业将会合理的利用分布式资源,动态的分配分片项。

    3.3 分片参数:

    分片的数量大于机器的数量,这样多个分片的任务,被分配到某个服务器,在执行任务的时候,可以获取到该分片对应的分片参数,就可以利用多线程进行任务的执行;

    可以通过 shardingItemParameters 设置分片参数格式:key=value:

    shardingItemParameters("0=Beijing,1=Shanghai,2=Guangzhou")
    
    • 1

    任务执行端 通过 ShardingContext getShardingParameter 获取当前分片参数:

    String  shardingParameter= shardingContext.getShardingParameter();
    
    • 1

    总结

    本文对elasticjob 的工作流程,zk 注册节点,elasticjob 的分片 进行介绍;

  • 相关阅读:
    用科学理性态度关注眼健康!孙丰源院长出席纪录片《眼睛的故事》研讨会
    如何让家居设备快速通过Matter认证?移远通信为您带来标准回答
    王道 第二章物理层
    当中国走进全球化的“深水区”,亚马逊云科技解码云时代的中国式跃升
    项目管理之项目风险管理
    2021 Jiangsu Collegiate Programming Contest F. Jumping Monkey II 树剖+线段树
    为人物化身持有者打造的 Alpha 第 3 季特别活动
    Matplotlib plt.plot数据可视化应用案例
    一看就会 MotionLayout使用的几种方式
    Echarts 教程二
  • 原文地址:https://blog.csdn.net/l123lgx/article/details/136625470