本文对elasticjob 的工作流程介绍;
ElasticJob 定位为轻量级无中心化解决方案,使用 jar 的形式提供分布式任务的协调服务。

app1,app2 表示不同的服务系统,每个系统都可以 引入elasticjob-lite-core jar 进行定时任务的执行;
elasticjob-lite-core 内部包括,任务执行实例的注册,leader 的选举,任务的调度;在任务调度过程中可以将日志进行保存到 数据库中;
ELK 可以对保存到数据库中的日志进行分析;
Console 可以连接到数据读取日志,从而获取到任务执行的轨迹;通过连接zk 可以知晓任务的运行状态,以及对任务的状态进行修改;
ElasticJob 的工作流程可以分为初始化、注册和运行三个主要步骤。以下是 ElasticJob 的工作流程详细步骤:
当任务启动后,会线连接zk;然后创建对应的zk 命名空间(如果命名空间不存在的话);创建任务节点;当任务需要被触发执行时,leader 节点会分配任务到哪些任务实例,然后任务实例接收任务并运行;


在 ElasticJob 中,任务的触发执行过程主要包括以下详细流程:
触发条件满足:根据任务的触发规则(如定时触发、手动触发等),当触发条件满足时,主节点会向作业节点发送触发任务执行的指令。
任务分片分配:作业节点接收到触发指令后,根据分片算法将任务分配给各个作业实例执行。每个作业实例负责执行其中一个或多个分片的任务数据。
任务执行:作业实例在接收到分片后,开始执行具体的任务逻辑。任务逻辑可以是数据处理、代码执行、脚本执行等,根据任务的配置和处理逻辑进行具体的执行操作。
监控日志记录:作业实例在执行任务过程中会记录执行日志,包括任务的执行情况、运行状态、执行结果等信息。这些日志可以帮助监控中心跟踪任务的执行情况。
弹性扩缩容:在任务执行过程中,如果系统负载增加或减少,主节点会根据配置的策略动态调整任务分片的分配情况,实现任务的弹性扩容和缩容。
结果处理:任务执行完成后,作业实例会将执行结果上报给主节点,并根据结果进行相应的处理,如通知用户、触发后续操作等。
总体来说,ElasticJob 的任务触发执行流程非常灵活和可靠,能够根据配置的规则和策略准确地触发、分配和执行任务。
当作业服务器在运行中宕机时,注册中心同样会通过临时节点感知,并将在下次运行时将分片转移至仍存活的服务器,以达到作业高可用的效果。 本次由于服务器宕机而未执行完的作业,则可以通过失效转移的方式继续执行。如下图所示

将分片总数设置为 1,并使用多于 1 台的服务器执行作业,作业将会以 1 主 n 从的方式执行。 一旦执行作业的服务器宕机,等待执行的服务器将会在下次作业启动时替补执行。开启失效转移功能效果更好,如果本次作业在执行过程中宕机,备机会立即替补执行。
每个Elastic-Job的任务执行实例作为ZooKeeper的客户端来操作ZooKeeper的znode
在 ElasticJob 中,主节点的作用主要包括以下几个方面:
协调任务调度:主节点负责协调任务的调度和执行,通过与 Zookeeper 交互实现任务的分配和调度。
分片调度:主节点会根据任务的配置信息和分片策略,将任务分配给不同的作业节点执行,确保任务能够顺利地分片执行。
监控和管理:主节点负责监控整个任务系统的运行状态,包括作业节点的健康状态、任务执行情况、运行日志等,并提供管理界面供用户查看和管理任务。
弹性扩缩容:主节点会根据任务的负载情况和配置的策略,动态调整任务的分片大小,实现任务的弹性扩容和缩容。
故障处理:主节点还负责处理作业节点的故障情况,例如重新分配故障节点上的任务分片,确保任务能够正常运行并保证数据处理的准确性。
作业分片是指任务的分布式执行,需要将一个任务拆分为多个独立的任务项,然后由分布式的应用实例分别执行某一个或几个分片项。
例如:Elastic-Job快速入门中文件备份的例子,现有2台服务器,每台服务器分别跑一个应用实例。为了快速的执行作业,那么可以将作业分成4片,每个应用实例个执行2片。作业遍历数据的逻辑应为:实例1查找text和image类型文件执行备份;
实例2查找radio和vedio类型文件执行备份。
如果由于服务器扩容应用实例数量增加为4,则作业遍历数据的逻辑应为:4个实例分别处理text、image、radio、video类型的文件。
可以看到,通过对任务合理的分片化,从而达到任务并行处理的效果,最大限度的提高执行作业的吞吐量。
分片项与业务处理解耦:
Elastic-job并不直接提供数据处理的功能,框架只会将分片项分配至各个运行中的作业服务器,开发者需要自行处理分片项与真实数据的对应关系。
最大限度利用资源:
将分片项设置为大于服务器的数量,最好是大于服务器倍数的数量,作业将会合理的利用分布式资源,动态的分配分片项。
分片的数量大于机器的数量,这样多个分片的任务,被分配到某个服务器,在执行任务的时候,可以获取到该分片对应的分片参数,就可以利用多线程进行任务的执行;
可以通过 shardingItemParameters 设置分片参数格式:key=value:
shardingItemParameters("0=Beijing,1=Shanghai,2=Guangzhou")
任务执行端 通过 ShardingContext getShardingParameter 获取当前分片参数:
String shardingParameter= shardingContext.getShardingParameter();
本文对elasticjob 的工作流程,zk 注册节点,elasticjob 的分片 进行介绍;