Disjob—分布式任务调度框架
简介
Disjob是一款分布式的任务调度框架,天然为支持分布式长任务执行而设计,它除了具备常规的任务调度功能外,还提供:任务拆分及分布式并行执行、暂停及取消运行中的任务、恢复执行被暂停的任务、任务执行失败重试、保存任务的执行快照(Savepoint)、任务依赖、任务编排(DAG)、广播任务等能力。以下是Disjob的整体流程图:
应用场景举例
举个简单的例子:统计在(0,1万亿]
区间内质数的个数。如果是单机单线程CPU的话要统计很长时间,这里我们就可以使用Disjob
框架提供的分布式并行执行的能力来解决该类问题。
- 拆分任务
先根据当前的机器资源情况来决定拆分任务的数量,比如我们有5台机器及每台2 core CPU(质数统计是CPU密集型),决定拆分为10个任务。
- 派发任务
Supervisor使用指定的路由算法把拆分的10个子任务派发给这些Worker机器。
- 接收任务
Worker接收到子任务后,会提交到框架定义的线程池中执行。
- 分布式并行执行
在执行时我们可以使用分批次方式(通过代码循环)来统计,这里我们指定task-1
在第一次循环统计(0, 1亿]
,第二次循环统计(10亿, 11亿]
,以此类推最后一次循环统计(9990亿, 9991亿]
。同理其它的task也是按同样的方式分布式并行统计。
P.s. 黎曼猜想中可知质数分布是大体均匀的,判断一个数是否质数有很多方法,如埃氏筛法、欧拉筛法、Miller Rabin素性检验,这里我们可以使用Guava库提供的素性检验。
- Savepoint
如果在统计过程中机器宕机后怎么办?难道再从头开始统计吗?No No No!我们可以在每循环10次(或每隔执行超过1分钟)时使用Savepoint
保存当前task-1
的执行快照。宕机异常后的重新启动任务时会读取这份快照数据,从上一次的状态中接着继续统计。以下是task-1
任务保存的快照数据样例
{ "next": 4000000001, // 下一次循环时要统计的区间为(40亿, 41亿] "count": 19819734, // 已经统计到了 19819734 个质数 "finished": false // 当前任务是否已经统计完成:true-是;false-否; }
- 暂停与恢复
假如我们的这几台机器资源需要临时做其它的事情,想把当前的统计任务暂停一段时间。No problem!框架是支持暂停执行中的任务
,只需要在管理后台的调度实例
页面,找到该任务点击暂停
按钮即可。在暂停时任务会接收到一个中断信号,收到中断信号时同样可以在代码中使用Savepoint
保存当前的执行快照。
当其它事情处理完后,我们可以在管理后台的调度实例
页面,找到被暂停的这个任务,点击恢复
按钮,此时任务会从上一次保存的状态中恢复继续执行。
- 异常中断
子任务在执行过程中若抛出框架的PauseTaskException,则会暂停
对应实例下全部的10个子任务(包括派发在不同机器中的任务)。同样如果抛出CancelTaskException则会取消
对应实例下全部的10个子任务。如果抛出其它类型的异常时,只会取消
当前子任务,对应实例下其它的子任务不受影响。
- 任务编排
现在这个质数统计的总任务已经执行完了,共10个子任务,每个子任务都统计出了它的那部分结果。Disjob能自动帮我汇总结果吗?Yes!框架提供了非常强大且方便的表达式来编排任务,如:A->B,C,(D->E)->D,F->G
,现在我们就可以创建一个汇总任务,然后再把这两个任务编排在一起。
以下是本例中质数统计的job数据,只列了部分主要字段,其中job_handler
为这两个任务处理器的编排(代码在项目源码中)
{ "jobGroup": "default", "jobName": "prime-count-dag", "jobState": 1, // job状态:0-禁用;1-启用; "jobType": 2, // job类型:1-普通(Normal);2-工作流(DAG); "jobHandler": "cn.ponfee.disjob.test.handler.PrimeCountJobHandler -> cn.ponfee.disjob.test.handler.PrimeAccumulateJobHandler", "jobParam": "{\"m\":1,\"n\":10000000000,\"blockSize\":100000000,\"parallel\":10}", "triggerType": 2, "triggerValue": "2023-09-02 18:00:00" }
本例中的质数统计流程图如下
项目地址
gitee : https://gitee.com/dromara/disjob

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
国美 App 抽奖页面弹窗辱骂其创始人
今日有网传消息称,进入国美 App 的“幸运大转盘”抽奖页面会出现一个弹窗,里面包含辱骂国美电器董事长黄秀虹、创始人黄光裕的内容,以及指控国美“拖欠工资”“拖欠货款”。 根据网友提供的截图,在国美 iOS 和 Android App 对应界面中,确实会出现如上图所示的弹窗。 国美零售在 8 月 31 日发布了财报数据,今年上半年,国美零售营收同比下跌 96.57%,从上年同期的 121.09 亿元降至 4.15 亿元。 自 2003 年以来,国美零售首次出现毛利为负的情况,在 2017 年至 2022 年累计归属于母公司拥有者应占亏损超 392 亿元的情况下,国美零售的亏损如今正逐渐增大。 除此之外,近年来国美的员工数量不断下降,据国美中报显示,2021 年末,国美集团旗下尚有 32278 名员工。但到了去年年中,国美集团的员工数已减少至 25701 名,而截至今年上半年末,国美集团目前只有 3609 名员工。 此外,据华商报今年上半年报道,直至 4 月中旬,西安国美电器实体门店全部关闭。许多西安市民反映,称国美电器实体店不发货、不退款。
- 下一篇
DHH 锐评“打包工具”:前端根本不需要构建 (No Build)
继“移除 TypeScript”后,Ruby on Rails 作者 DHH 近日又在公开场合发表了一番“暴论”——称最快的打包工具就是没有打包(No Build),有了 HTTP/2 以及浏览器原生支持 ES Modules ,前端根本不需要构建。 在上周举办的Rails World 大会上,DHH 说道:“最先进的(打包)技术不再是寻找更复杂的方法来构建 JavaScript 或 CSS,因为前端根本不需要构建。现在可以依靠 HTTP/2 和对 import map 的普遍支持来避免打包。” viahttps://twitter.com/dhh/status/1712145950397841826 对于 DHH 提出的「No Build」,Vercel CTOMalte Ubl 称他们已尝试过,结果是行不通。因为在 HTTP2 中,每个请求的开销仍然非常大,并且存在并发限制,此外还会出现瀑布流和低效压缩。 目前,“打包”对于高性能网站来说是无法绕过的。 viahttps://twitter.com/cramforce/status/1712265070213050390 DHH 不...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- CentOS8编译安装MySQL8.0.19
- CentOS6,CentOS7官方镜像安装Oracle11G
- CentOS7,8上快速安装Gitea,搭建Git服务器
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- MySQL8.0.19开启GTID主从同步CentOS8
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- Red5直播服务器,属于Java语言的直播服务器
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7