(19)国家知识产权局
(12)发明 专利
(10)授权公告 号
(45)授权公告日
(21)申请 号 202210668844.8
(22)申请日 2022.06.14
(65)同一申请的已公布的文献号
申请公布号 CN 114756357 A
(43)申请公布日 2022.07.15
(73)专利权人 浙江保融科技股份有限公司
地址 310023 浙江省杭州市余杭区仓前街
道文一西路15 00号3幢23 6室
(72)发明人 孙恒涛 方汉林 傅和平
(74)专利代理 机构 杭州华鼎知识产权代理事务
所(普通合伙) 33217
专利代理师 魏亮
(51)Int.Cl.
G06F 9/48(2006.01)
G06F 9/455(2006.01)G06F 9/50(2006.01)
G06F 9/52(2006.01)
(56)对比文件
CN 110177118 A,2019.08.27
钱宇虹.如何用Java回调和线程实现异步调
用. 《软件工程师》 .2013,(第10期),
朱.Java语言中非阻塞算法的实现. 《电脑知
识与技术》 .2015,(第20期),
审查员 荆苏丹
(54)发明名称
一种基于JVM的非阻塞分布式计划任务调度
方法
(57)摘要
本发明提供一种基于JVM的非阻塞分布式计
划任务调度方法, 在完全实现原有功能的基础
上, 解决线程数量占用过多、 分布式下有节点空
跑线程的问题。 为实现上述目的, 本发明采用如
下技术方案: 应用于配置有kotlin语言库及
coroutines协程库的JV M虚拟机中, 包 括: 分布式
计划任务框架, 还包括分布式协调组件; 分布式
协调组件中设置有通用非阻塞增删 改查接口作
为分布式协调组件所在客户端的非阻塞异步回
调接口; 通过协程封装分布式协调组件的非阻塞
异步回调接口, 并设置非阻塞循环 监听器实现连
续监听; 最终基于封装后的协程非阻塞api重新
实现一个本地节点缓存。 本发明通过非阻塞改
造, 在执行任务的性能方面得以显著的提升 。
权利要求书1页 说明书9页 附图7页
CN 114756357 B
2022.10.14
CN 114756357 B
1.一种基于JVM的非阻塞分布式计划任务调度方法, 应用于配置有kotlin语言库及
coroutines协程库的JVM虚拟 机中, 其特征在于, 包括: 分布式计划任务框架, 所述分布式计
划任务框架内包 含:
并发任务执 行器: 调用应用逻辑实际执 行的包;
定时任务调度器: 进行任务的包括配置、 启动、 暂停、 停止、 删除的生命周期操作;
还包括分布式协调组件; 分布式协调组件中设置有通用非阻塞增删改查接口作为分布
式协调组件所在客户端的非阻塞异步回调接口;
coroutines协程库对接分布式协调组件的客户端的非阻塞异步回调接口;
通过协程封装分布式协调组件的非阻塞异步 回调接口, 并设置非阻塞循环监 听器实现
连续监听; 最 终基于封装后的协 程非阻塞api重新 实现一个本地节 点缓存; 定时任务调度器
在新的计划任务实例启动时, 向分布式协调组件注册自己的任务实例信息、 并获取已有的
当前任务其他所有实例信息, 通过选主操作确定当前 的任务主节点; 非阻塞异步回调接口
创建任务时设置 分片, 主节点按任务 实例ip信息, 采用平均、 轮询策略分配 分片执行节 点信
息, 写入分布式协调组件;
还包括java客户端, 通过java客户端执行任务; 当分布式协调组件为ZooKeep er组件时
采用二级动态封装; 其中, 第一级封装调用suspendCancellableCoroutine方法, 回调方法
入参产生CancellableContinuation实例; 利用该实例进行第二级封装; 第二级封装中各个
需要转换协程的ZooKeeper方法生成对应的AsyncCallback子接口的匿名内部类, 所述匿名
内部类通过内部调用传入的CancellableContinuation实例的resume、
resumeWithException方法来和协程对接 。
2.根据权利要求1所述的一种基于JVM的非阻塞分布式计划任务调度方法, 其特征在
于, 封装过程中对ZooKeeper节点树添加增删改查操作, 并在同时执行的操作数量大于2的
时候, 通过协程封装的形式调用异步事务 提交接口。
3.根据权利要求1所述的一种基于JVM的非阻塞分布式计划任务调度方法, 其特征在
于, 封装了一个包装类循环监听器, 每次收到事件后, 将自身监听器自动添加 到ZooKeeper
组件, 然后再 执行包装类循环监听器的逻辑, 从而实现连续 监听。
4.根据权利要求3所述的一种基于JVM的非阻塞分布式计划任务调度方法, 其特征在
于, 还实现了非阻塞本地缓存及缓存监听, 封装后的协程非阻塞api重新实现一个
ZooKeeper本地节点缓存;
具体实现方式为: 使用散列表持有数据, 非阻塞锁控制并发, 循环监 听器实时监听远程
ZooKeeper服务端节点子树变动的状态。
5.根据权利要求1所述的一种基于JVM的非阻塞分布式计划任务调度方法, 其特征在
于, 所述并发任务执行器调用应用逻辑实际执行的包, 使用协程的async+awaitAll方法结
构化并发 实现。
6.根据权利要求1所述的一种基于JVM的非阻塞分布式计划任务调度方法, 其特征在
于, 定时任务调 度逻辑放在定时任务列表, 核心逻辑是在协 程里实现无限循环, 进 行定时计
算, 获取下一个执行时间, 延迟与当前时间的间隔, 然后调用这个任务的并发任务执行器;
并发任务执行器收到任务调度, 判断当前节点是不是这个任务当前分片的执行节点, 如果
是就执行这个任务, 否则略过。权 利 要 求 书 1/1 页
2
CN 114756357 B
2一种基于 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种分
片广播路由策略, 通过广播模式广播任务, 所有任务流控规则验证通过的执行器机器均会
尝试拉取任务, 根据业务逻辑最 终仅有一台机器能完整的完成系统标记身份确认以及 任务
调度确认, 降低了出现 “抢占式”业务执行逻辑时的负载风险。 由此可见, 为了解决线程资源
浪费的问题, 现有技术把所有的任务放在 任务调度中心, 调度中心连接 关系型数据库, 所有
的数据放数据库里面, 靠数据库锁控制并发、 保证调 度的一致性。 这种方案一定程度上缓解
了线程资源消 耗过大这个 问题, 任务调度中心使用数量有限的线程做所有任务的调度, 主
体逻辑放在一个无限循环里面, 任务的触发分发给工作节点, 工作节点只需要一个任务一
个线程持续运行就好, 不需要 更多的监听线程。 但中心化任务调 度中心也带来了性能有限、
可扩展性降低、 弹性调 度变弱的缺点, 并且在工作节点也是需要 执行线程长期驻留的, 属于
阻塞式代码。说 明 书 1/9 页
3
CN 114756357 B
3
专利 一种基于JVM的非阻塞分布式计划任务调度方法
文档预览
中文文档
18 页
50 下载
1000 浏览
0 评论
309 收藏
3.0分
温馨提示:本文档共18页,可预览 3 页,如浏览全部内容或当前文档出现乱码,可开通会员下载原始文档
本文档由 人生无常 于 2024-03-18 13:26:47上传分享