ElasticJob 作为 Apache ShardingSphere 社区的子项目之一,是面向互联网生态和海量任务的分布式调度解决方案。
自 ElasticJob 3.0.1 发布后,ElasticJob 在 GitHub 上收到了不少用户的使用反馈,同时也合并了一些由社区同学贡献的代码,对 ElasticJob 的故障转移特性、作业调度稳定性、作业 API、Java 19 兼容性等方面进行了完善,促成本次 ElasticJob 3.0.2 的发布。
3.0.2 关键特性
优化 Failover(故障转移)特性
Failover 是 ElasticJob 的重要特性之一。
在 ElasticJob 3.0.1 中,Failover 特性存在一定的局限性与使用不便的地方:
-
Failover 需要有至少 2 个作业进程(job instance,称之为进程更易于理解)才能够发挥作用。假设只有 1 个作业进程正在执行作业,作业进程在执行过程中发生故障,这种情况下即使进程故障恢复或者在故障发生后启动一个新的作业进程,Failover 也无法生效。因此,过去版本的 Failover 特性要求冗余部分资源,尤其是在作业不需要分片的情况下,备份进程会长时间空闲并持续占用着资源。
-
Failover 触发比较敏感,即使作业不在运行状态,其中一个进程下线,也会触发另一个进程的 Failover 将下线进程所拥有的分片立即执行一次。无论进程下线是因为正常下线还是发生故障,Failover 都会触发,给用户带来不便。
ElasticJob 3.0.2 对 Failover 特性进行了优化:
-
假设唯一一个作业进程正在执行作业,在作业执行过程中进程因为故障退出。故障发生后启动新的作业进程,新的进程能够检测到曾经发生故障的分片,并立即触发 Failover 能力。比如我们在 K8S 环境下,部署了一个副本数为 1 的作业进程。如果该作业进程在执行作业过程中因故障意外退出,K8S 自动启动另一个新的作业进程,此时 Failover 特性会在新的作业进程被触发,继续执行之前发生故障的作业。
-
优化后的 Failover 仅对正在执行的作业生效。如果作业进程发生故障时没有作业正在执行,Failover 在此时不会被触发,避免了作业进程正常下线导致 Failover 被触发的情况。
隔离不同作业的事件通知线程,并避免代码中可能存在死循环的风险
ElasticJob 目前主要通过 ZooKeeper 实现分布式协调。在 ElasticJob 实际使用过程中,用户可能会在同一个项目中同时启动多个作业,这些作业都复用同一个 Apache Curator 客户端。由于 ZooKeeper 的特性及 Curator 在单一事件线程中回调方法的实现(https://cwiki.apache.org/confluence/display/CURATOR/TN1),此时存在一定的风险:
-
如果作业过多且频繁触发,相应的回调也会更多,Curator 事件线程的处理能力可能会达到上限,导致作业被延迟触发或者迟迟无法触发。
-
如果因为某一作业意外阻塞了 Curator 事件线程,其他作业也会由于 Curator 事件线程故障受影响,导致作业延迟触发或无法触发。
在 ElasticJob 3.0.2 中,每个作业所属的回调方法将会在作业所属的线程执行,减少了作业之间影响的风险。
另外,ElasticJob 3.0.2 中也避免了一处可能会发生死循环的代码。当作业进程在线,且 ZooKeeper 中的 server 节点发生变动(例如被删除)时,可能会导致 ElasticJob 判断 server 启用状态的方法陷入死循环,本次版本优化了此问题。
支持 Java 19
Java 19 在 2022 年 9 月 20 日已正式发布,ElasticJob 代码紧随 Java 版本,已支持通过 Java 19 构建及使用。目前,ElasticJob 支持的 Java 版本为 8 至 19。
Release Notes
问题修复
-
https://github.com/smartBun
-
https://github.com/RedRed228
-
https://github.com/xlcn
-
https://github.com/TeslaCN
-
https://github.com/Jovons
-
https://github.com/pandaapo
-
https://github.com/TeslaCN
-
修复当次作业执行过程中产生的错误信息,在下次作业执行前没有被清理的问题
-
避免部分代码中可能会发生死循环的风险,并隔离不同作业的事件通知线程
-
修复 job instance ID、作业配置反序列化可能会发生 NPE 的问题
-
优化 Failover 功能触发过于敏感的问题
增强
-
https://github.com/cocodroid
-
https://github.com/cocodroid
-
https://github.com/TeslaCN
-
脚本作业发生错误时能够显示异常堆栈
-
使用 Spring Boot 时支持使用不同的数据源作为 ElasticJob 事件跟踪数据源
-
ElasticJob 支持 Java 19
详细信息请参照 GitHub ElasticJob 仓库 Milestone。
参考文档
🔗 ElasticJob Milestone:https://github.com/apache/shardingsphere-elasticjob/milestone/5?closed=1
🔗 更新日志:
https://github.com/apache/shardingsphere-elasticjob/blob/master/RELEASE-NOTES.md
🔗 ShardingSphere ElasticJob 项目地址:
https://github.com/apache/shardingsphere-elasticjob
🔗 ShardingSphere 项目地址:
https://github.com/apache/shardingsphere
🔗 ShardingSphere ElasticJob 官网地址:
https://shardingsphere.apache.org/elasticjob
作者
吴伟杰,SphereEx 基础设施研发工程师,Apache ShardingSphere PMC。专注于 Apache ShardingSphere 接入端及 ShardingSphere 子项目 ElasticJob 的研发。