一种基于JVM的非阻塞分布式计划任务调度方法技术

技术编号:37531720 阅读:22 留言:0更新日期:2023-05-12 15:58
本发明专利技术提供一种基于jvm的非阻塞分布式计划任务调度方法,在完全实现原有功能的基础上,解决线程数量占用过多、分布式下有节点空跑线程的问题。为实现上述目的,本发明专利技术创造采用如下技术方案:一种基于jvm的非阻塞分布式计划任务调度方法,应用于配置有kotlin语言库及coroutines协程库的Jvm虚拟机中,包括:分布式计划任务框架,还包括分布式协调组件;分布式协调组件中设置有通用非阻塞增删改查接口作为分布式协调组件所在客户端的非阻塞异步回调接口;通过协程封装分布式协调组件的非阻塞异步回调接口,并设置非阻塞循环监听器实现连续监听;最终基于封装后的协程非阻塞api重新实现一个本地节点缓存。本发明专利技术通过非阻塞改造,性能方面得以显著的提升。性能方面得以显著的提升。性能方面得以显著的提升。

【技术实现步骤摘要】
一种基于JVM的非阻塞分布式计划任务调度方法


[0001]本专利技术属于分布式任务调度
,尤其是一种基于JVM的非阻塞分布式计划任务调度方法。

技术介绍

[0002]计划任务是指有计划的定时运行或者周期性运行的程序,最常见的计划任务包括了基于Linux的“crontab”以及基于Windows的“计划任务程序”。但随着新建项目越来越大,系统越来越复杂,现有的计划任务就暴露出许多问题。首先是高可用HA需求,当运行计划任务的服务器一旦出现故障,所有的计划任务将停止工作。其次是性能问题,越来越多的大型计划任务程序出现,对CPU/IO密集操作,单个节点已经无法满足需求。因此就需要设计分布式计划任务,通过协调多台主机来执行大量的任务,解决高可用的问题。
[0003]这一问题在C语言环境下比较容易解决,例如专利号为CN201811615533.5的专利技术专利《数据同步的系统、方法、装置和计算机存储介质》中就公开了一种数据同步系统、方法、装置和计算机存储介质。所述系统包括数据监听模块、消息分发模块、数据同步模块、以及配置管理模块;数据监听模块,用于对数据源进行监听以获取数据源的数据变更记录;消息分发模块,用于创建与数据源对应的消息队列,将数据变更记录加入到消息队列中;配置管理模块,用于管理数据源的同步配置参数;数据同步模块,用于获取同步配置参数,按照同步配置参数创建消费协程;由消费协程监听消息队列,按照同步配置参数将数据变更记录更新到目标存储中。这样的技术方案实现于诸如Smalltalk、C++等编程语言中,但是无法实现于java环境下。
[0004]在java环境下,现有技术中通常采用XXL

JOB分布式任务调度系统来实现分布式计划任务。例如专利申请号为202111626396.7的专利技术专利申请《基于XXL

JOB分布式任务调度系统的路由策略》中就公开了及一种基于XXL

JOB分布式任务调度系统的路由策略,包括以下步骤:各执行器自身根据任务流控规则判断当前是否可参与新任务;可执行新任务的执行器与调度中心之间确认系统标识,调度中心选定其中一台执行器为任务调度机器;任务调度机器接收任务参数并执行;优势在于:基于XXL

JOB分布式任务调度平台第10种分片广播路由策略,通过广播模式广播任务,所有任务流控规则验证通过的执行器机器均会尝试拉取任务,根据业务逻辑最终仅有一台机器能完整的完成系统标记身份确认以及任务调度确认,降低了出现“抢占式”业务执行逻辑时的负载风险。由此可见,为了解决线程资源浪费的问题,现有技术把所有的任务放在任务调度中心,调度中心连接关系型数据库,所有的数据放数据库里面,靠数据库锁控制并发、保证调度的一致性。这种方案一定程度上缓解了线程资源消耗过大这个问题,任务调度中心使用数量有限的线程做所有任务的调度,主体逻辑放在一个无限循环里面,任务的触发分发给工作节点,工作节点只需要一个任务一个线程持续运行就好,不需要更多的监听线程。但中心化任务调度中心也带来了性能有限、可扩展性降低、弹性调度变弱的缺点,并且在工作节点也是需要执行线程长期驻留的,属于阻塞式代码。
[0005]线程是比较重的资源,阻塞式代码阻塞了线程,让线程停止运行,并在一个地方长时间等待,资源消耗多、性能浪费。但这就是目前java环境下大多数代码的编程方式。目前java下实现非阻塞只有回调式写法,如Project Reactor、Vert.x,非阻塞回调式写法代码要求高,实现非常困难,难以编码、调试、学习、排错、代码阅读,这也导致了目前java环境下略微复杂功能的非阻塞代码无法实现。

技术实现思路

[0006]为克服现有技术的不足及存在的问题,本专利技术提供一种基于JVM的非阻塞分布式计划任务调度方法,以非阻塞的kotlin coroutine协程技术替代java多线程技术,对现有的分布式计划任务框架elastic

job重新实现,在完全实现原有功能的基础上,解决线程数量占用过多、分布式下有节点空跑线程的问题。
[0007]为实现上述目的,本专利技术创造采用如下技术方案:
[0008]一种基于JVM的非阻塞分布式计划任务调度方法,应用于配置有kotlin语言库及coroutines协程库的JVM虚拟机中,包括:分布式计划任务框架,所述分布式计划任务框架内包含:
[0009]并发任务执行器:调用应用逻辑实际执行的包;
[0010]定时任务调度器:进行任务的包括配置、启动、暂停、停止、删除的生命周期操作;
[0011]还包括分布式协调组件;分布式协调组件中设置有通用非阻塞增删改查接口作为分布式协调组件所在客户端的非阻塞异步回调接口;
[0012]coroutines协程库对接分布式协调组件的客户端的非阻塞异步回调接口;
[0013]通过协程封装分布式协调组件的非阻塞异步回调接口,并设置非阻塞循环监听器实现连续监听;最终基于封装后的协程非阻塞api重新实现一个本地节点缓存;
[0014]定时任务调度器在新的计划任务实例启动时,向分布式协调组件注册自己的任务实例信息、并获取已有的当前任务其他所有实例信息,通过选主操作确定当前的任务主节点;非阻塞异步回调接口创建任务时设置分片,主节点按任务实例ip信息,采用平均、轮询策略分配分片执行节点信息,写入分布式协调组件;
[0015]还包括java客户端,通过java客户端执行任务。
[0016]优选的,所述分布式协调组件为ZooKeeper组件或Etcd组件。通常采用ZooKeeper组件作为分布式协调组件,但是当ZooKeeper组件无法启动或被禁用时采用Etcd组件作为分布式协调组件。
[0017]优选的,当分布式协调组件为ZooKeeper组件时采用二级动态封装;其中,第一级封装调用suspendCancellableCoroutine方法,回调方法入参产生CancellableContinuation实例;利用该实例进行第二级封装;第二级封装中各个需要转换协程的ZooKeeper方法生成对应的AsyncCallback子接口的匿名内部类,所述匿名内部类内部调用传入的CancellableContinuation实例的resume、resumeWithException方法来和协程对接。这样把ZooKeeper原本的异步回调方法转化为协程方法。优选的,所述封装过程中对ZooKeeper节点树添加增删改查操作,并在同时执行的操作数量大于2的时候,通过协程封装的形式调用异步事务提交接口。
[0018]优选的,封装了一个包装类循环监听器LoopWatcher,每次收到事件后,再自身监
听器自动添加到ZooKeeper组件,然后再执行包装类循环监听器的逻辑,从而实现连续监听。基于ZooKeeper的原生节点watcher监听一次就被移除掉了,不能连续监听。因此本专利技术就建立了一个包装类循环监听器LoopWatcher,每次收到事件后再本文档来自技高网
...

【技术保护点】

【技术特征摘要】
1.一种基于JVM的非阻塞分布式计划任务调度方法,应用于配置有kotlin语言库及coroutines协程库的Jvm虚拟机中,其特征在于,包括:分布式计划任务框架,所述分布式计划任务框架内包含:并发任务执行器:调用应用逻辑实际执行的包;和定时任务调度器;定时任务调度器进行任务的包括配置,启动、暂停、停止、删除的生命周期操作;还包括分布式协调组件;所述分布式协调组件为Etcd组件;具体通过抽出接口分离注册协调服务包;把所有和ZooKeeper组件相关的代码抽出接口,然后把所述抽出接口和ZooKeeper组件实现代码分成两个jar包;新建一个etcd的jar包,对接口包的所有用到的接口方法、数据结构做实现;分布式协调组件中设置有通用非阻塞增删改查接口作为分布式协调组件所在客户端的非阻塞异步回调接口;coroutines协程库对接分布式协调组件的客户端异步接口;通过协程封装分布式协调组件的非阻塞异步回调接口,并设置非阻塞循环监听器实现连续监听;最终基于封装后的协程非阻塞api重新实现一个本地节点缓存;定时任务调度器在新的计划任务实例启动时,会向分布式协调组件注册自己的任务实例信息、并获取已有的当前任务其他所有实例的信息,通过选主操作确定当前的任务主节点;任务提供设置分片的方式,主节点按任务实例ip信息,平均、轮询等策略分配分片的执行节点信息,写入分布式协调组件;还包括java客户端,通过java客户端执行任务。2.根据权利要求1所述的一种基于JVM的非阻塞分布式计划任务调度方法,其特征在于,通过添加一个job根目录前缀监听,然后对接接口分发所有远程数据变动事件来模拟实现缓存监听器。3.根据权利要求1所述的一种基于JVM的非阻塞分布式计划任务调度方法,其特征在于,Etcd组件中普通节点的增删改查操作,直接调用Etcd客户端提供的返回CompletableFuture的接口,然后使用kotlinx

coroutines

jdk8包提供的CompletableFuture.await方法对接。4.根据权利要求1所述的一种基于JVM的非...

【专利技术属性】
技术研发人员:孙恒涛方汉林傅和平
申请(专利权)人:浙江保融科技股份有限公司
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1