ElasticJob-Lite 3.0 配置和使用——中文官方文档
https://shardingsphere.apache.org/elasticjob/current/cn/overview/
ElasticJob > 概念 & 功能 > 失效转移
ElasticJob 不会在本次执行过程中进行重新分片,而是等待下次调度之前才开启重新分片流程。 当作业执行过程中服务器宕机,失效转移允许将该次未完成的任务在另一作业节点上补偿执行。
概念
失效转移是当前执行作业的临时补偿执行机制,在下次作业运行时,会通过重分片对当前作业分配进行调整。 举例说明,若作业以每小时为间隔执行,每次执行耗时 30 分钟。如下如图所示。

图中表示作业分别于 12:00,13:00 和 14:00 执行。图中显示的当前时间点为 13:00 的作业执行中。
如果作业的其中一个分片服务器在 13:10 的时候宕机,那么剩余的 20 分钟应该处理的业务未得到执行,并且需要在 14:00 时才能再次开始执行下一次作业。 也就是说,在不开启失效转移的情况下,位于该分片的作业有 50 分钟空档期。如下如图所示。

在开启失效转移功能之后,ElasticJob 的其他服务器能够在感知到宕机的作业服务器之后,补偿执行该分片作业。如下图所示。

在资源充足的情况下,作业仍然能够在 13:30 完成执行。
执行机制
当作业执行节点宕机时,会触发失效转移流程。ElasticJob 根据触发时的分布式作业执行的不同状况来决定失效转移的执行时机。
通知执行
当其他服务器感知到有失效转移的作业需要处理时,且该作业服务器已经完成了本次任务,则会实时的拉取待失效转移的分片项,并开始补偿执行。 也称为实时执行。
问询执行
作业服务在本次任务执行结束后,会向注册中心问询待执行的失效转移分片项,如果有,则开始补偿执行。 也称为异步执行。
适用场景
开启失效转移功能,ElasticJob 会监控作业每一分片的执行状态,并将其写入注册中心,供其他节点感知。
在一次运行耗时较长且间隔较长的作业场景,失效转移是提升作业运行实时性的有效手段; 对于间隔较短的作业,会产生大量与注册中心的网络通信,对集群的性能产生影响。 而且间隔较短的作业并未见得关注单次作业的实时性,可以通过下次作业执行的重分片使所有的分片正确执行,因此不建议短间隔作业开启失效转移。
另外需要注意的是,作业本身的幂等性,是保证失效转移正确性的前提。
————————————————————————————————————————
ElasticJob > 概念 & 功能 > 错过任务重执行
ElasticJob 不允许作业在同一时间内叠加执行。 当作业的执行时长超过其运行间隔,错过任务重执行能够保证作业在完成上次的任务后继续执行逾期的作业。
概念
错过任务重执行功能可以使逾期未执行的作业在之前作业执行完成之后立即执行。 举例说明,若作业以每小时为间隔执行,每次执行耗时 30 分钟。如下如图所示。

图中表示作业分别于 12:00,13:00 和 14:00 执行。图中显示的当前时间点为 13:00 的作业执行中。
如果 12:00 开始执行的作业在 13:10 才执行完毕,那么本该由 13:00 触发的作业则错过了触发时间,需要等待至 14:00 的下次作业触发。 如下如图所示。

在开启错过任务重执行功能之后,ElasticJob 将会在上次作业执行完毕后,立刻触发执行错过的作业。如下图所示。

在 13:00 和 14:00 之间错过的作业将会重新执行。
适用场景
在一次运行耗时较长且间隔较长的作业场景,错过任务重执行是提升作业运行实时性的有效手段; 对于未见得关注单次作业的实时性的短间隔的作业来说,开启错过任务重执行并无必要。
————————————————————————————————————
注册中心配置项
可配置属性
属性名 | 类型 | 缺省值 | 描述 |
serverLists | String | 连接 ZooKeeper 服务器的列表 | |
namespace | String | ZooKeeper 的命名空间 | |
baseSleepTimeMilliseconds | int | 1000 | 等待重试的间隔时间的初始毫秒数 |
maxSleepTimeMilliseconds | String | 3000 | 等待重试的间隔时间的最大毫秒数 |
maxRetries | String | 3 | 最大重试次数 |
sessionTimeoutMilliseconds | boolean | 60000 | 会话超时毫秒数 |
connectionTimeoutMilliseconds | boolean | 15000 | 连接超时毫秒数 |
digest | String | 无需验证 | 连接 ZooKeeper 的权限令牌 |
核心配置项说明
serverLists:
包括 IP 地址和端口号,多个地址用逗号分隔,如: host1:2181,host2:2181
作业配置项
可配置属性
属性名 | 类型 | 缺省值 | 描述 |
jobName | String | 作业名称 | |
shardingTotalCount | int | 作业分片总数 | |
cron | String | CRON 表达式,用于控制作业触发时间 | |
timeZone | String | CRON 的时区设置 | |
shardingItemParameters | String | 个性化分片参数 | |
jobParameter | String | 作业自定义参数 | |
monitorExecution | boolean | true | 监控作业运行时状态 |
failover | boolean | false | 是否开启任务执行失效转移 |
misfire | boolean | true | 是否开启错过任务重新执行 |
maxTimeDiffSeconds | int | -1(不检查) | 最大允许的本机与注册中心的时间误差秒数 |
reconcileIntervalMinutes | int | 10 | 修复作业服务器不一致状态服务调度间隔分钟 |
jobShardingStrategyType | String | AVG_ALLOCATION | 作业分片策略类型 |
jobExecutorServiceHandlerType | String | CPU | 作业线程池处理策略 |
jobErrorHandlerType | String | 作业错误处理策略 | |
description | String | 作业描述信息 | |
props | Properties | 作业属性配置信息 | |
disabled | boolean | false | 作业是否禁止启动 |
overwrite | boolean | false | 本地配置是否可覆盖注册中心配置 |
核心配置项说明
shardingItemParameters:
分片序列号和参数用等号分隔,多个键值对用逗号分隔。 分片序列号从0开始,不可大于或等于作业分片总数。 如:0=a,1=b,2=c
jobParameter:
可通过传递该参数为作业调度的业务方法传参,用于实现带参数的作业 例:每次获取的数据量、作业实例从数据库读取的主键等。
monitorExecution:
每次作业执行时间和间隔时间均非常短的情况,建议不监控作业运行时状态以提升效率。 因为是瞬时状态,所以无必要监控。请用户自行增加数据堆积监控。并且不能保证数据重复选取,应在作业中实现幂等性。 每次作业执行时间和间隔时间均较长的情况,建议监控作业运行时状态,可保证数据不会重复选取。
maxTimeDiffSeconds:
如果时间误差超过配置秒数则作业启动时将抛异常。
reconcileIntervalMinutes:
在分布式的场景下由于网络、时钟等原因,可能导致 ZooKeeper 的数据与真实运行的作业产生不一致,这种不一致通过正向的校验无法完全避免。 需要另外启动一个线程定时校验注册中心数据与真实作业状态的一致性,即维持 ElasticJob 的最终一致性。
配置为小于 1 的任意值表示不执行修复。
jobShardingStrategyType:
详情请参见内置分片策略列表。
jobExecutorServiceHandlerType:
详情请参见内置线程池策略列表。
jobErrorHandlerType:
详情请参见内置错误处理策略列表。
props:
详情请参见作业属性配置列表。
disabled:
可用于部署作业时,先禁止启动,部署结束后统一启动。
overwrite:
如果可覆盖,每次启动作业都以本地配置为准。
作业监听器配置项
常规监听器配置项
可配置属性:无
分布式监听器配置项
可配置属性
属性名 | 类型 | 缺省值 | 描述 |
started-timeout-milliseconds | long | Long.MAX_VALUE | 最后一个作业执行前的执行方法的超时毫秒数 |
completed-timeout-milliseconds | long | Long.MAX_VALUE | 最后一个作业执行后的执行方法的超时毫秒数 |
事件追踪配置项
可配置属性
属性名 | 类型 | 缺省值 | 描述 |
type | String | 事件追踪存储适配器类型 | |
storage | 泛型 | 事件追踪存储适配器对象 |