首页 > 其他分享 >Disjob—分布式任务调度框架

Disjob—分布式任务调度框架

时间:2023-10-19 23:46:00浏览次数:42  
标签:10 Disjob 质数 任务 任务调度 统计 分布式

简介

Disjob是一款分布式的任务调度框架,天然为支持分布式长任务执行而设计,它除了具备常规的任务调度功能外,还提供:任务拆分及分布式并行执行、暂停及取消运行中的任务、恢复执行被暂停的任务、任务执行失败重试、保存任务的执行快照(Savepoint)、任务依赖、任务编排(DAG)、广播任务等能力。

Disjob的整体流程图如下

应用场景举例

举个简单的例子:统计在(0,1万亿]区间内质数的个数。如果是单机单线程CPU的话要统计很长时间,这里我们就可以使用Disjob框架提供的分布式并行执行的能力来解决该类问题。

  1. 拆分任务

先根据当前的机器资源情况来决定拆分任务的数量,比如我们有5台机器及每台2 core CPU(质数统计是CPU密集型),决定拆分为10个任务。

  1. 派发任务

Supervisor使用指定的路由算法把拆分的10个子任务派发给这些Worker机器。

  1. 接收任务

Worker接收到子任务后,会提交到框架定义的线程池中执行。

  1. 分布式并行执行

在执行时我们可以使用分批次方式(通过代码循环)来统计,这里我们指定task-1在第一次循环统计(0, 1亿],第二次循环统计(10亿, 11亿],以此类推最后一次循环统计(9990亿, 9991亿]。同理其它的task也是按同样的方式分布式并行统计。

P.s. 黎曼猜想中可知质数分布是大体均匀的,判断一个数是否质数有很多方法,如埃氏筛法、欧拉筛法、Miller Rabin素性检验,这里我们可以使用Guava库提供的素性检验。

  1. Savepoint

如果在统计过程中机器宕机后怎么办?难道再从头开始统计吗?No No No!我们可以在每循环10次(或每隔执行超过1分钟)时使用Savepoint保存当前task-1的执行快照。宕机异常后的重新启动任务时会读取这份快照数据,从上一次的状态中接着继续统计。以下是task-1任务保存的快照数据样例

{
  "next": 4000000001, // 下一次循环时要统计的区间为(40亿, 41亿]
  "count": 19819734,  // 已经统计到了 19819734 个质数
  "finished": false   // 当前任务是否已经统计完成:true-是;false-否;
}
  1. 暂停与恢复

假如我们的这几台机器资源需要临时做其它的事情,想把当前的统计任务暂停一段时间。No problem!框架是支持暂停执行中的任务,只需要在管理后台的调度实例页面,找到该任务点击暂停按钮即可。在暂停时任务会接收到一个中断信号,收到中断信号时同样可以在代码中使用Savepoint保存当前的执行快照。

当其它事情处理完后,我们可以在管理后台的调度实例页面,找到被暂停的这个任务,点击恢复按钮,此时任务会从上一次保存的状态中恢复继续执行。

  1. 异常中断

子任务在执行过程中若抛出框架的PauseTaskException,则会暂停对应实例下全部的10个子任务(包括派发在不同机器中的任务)。同样如果抛出CancelTaskException则会取消对应实例下全部的10个子任务。如果抛出其它类型的异常时,只会取消当前子任务,对应实例下其它的子任务不受影响。

  1. 任务编排

现在这个质数统计的总任务已经执行完了,共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

github: https://github.com/dromara/disjob

标签:10,Disjob,质数,任务,任务调度,统计,分布式
From: https://www.cnblogs.com/ponfee/p/17775989.html

相关文章

  • docker-compose搭建多主机分布式minio
    minio介绍Minio是个基于Golang编写的开源对象存储套件,虽然轻量,却拥有着不错的性能。官网地址:MinIO|HighPerformance,KubernetesNativeObjectStorage何为对象存储?我们来看下阿里云OSS(ObjectStorageService)的介绍:对象存储服务(ObjectStorageService,OSS)是一种海量......
  • 雪花算法:分布式唯一ID生成利器
    雪花算法:分布式唯一ID生成利器程序新视界 ​关注他 前言无论是在分布式系统中的ID生成,还是在业务系统中请求流水号这一类唯一编号的生成,都是软件开发人员经常会面临的一场景。而雪花算法便是这些场景的一个解决方案。以分布式ID为例,它的生成往往会在唯一性......
  • Redisson 实现分布式锁
    Redisson实现分布式锁分布式锁的应用场景有哪些?实现的方式有哪几种?Redisson又是怎么实现的?1、应用场景、特点及实现方式1.1、分布式锁的应用场景主要有以下两类:提升处理效率:避免重复任务的执行,减少系统资源的浪费(例如幂等场景)。保障数据一致性:在多个微服务并发访问时,避免......
  • 分布式事务
    参考:《凤凰架构》,原书--------- https://icyfenix.cn/ 本节所说的分布式事务(DistributedTransaction)特指多个服务同时访问多个数据源的事务处理机制。CAP定理(Consistency、Availability、PartitionToleranceTheorem),也称为Brewer定理,起源于2000年7月,是加州大学伯克利分校......
  • Xxl-job 分布式调度任务使用
    Xxl-job分布式调度任务使用一.XXL-job产品介绍1.简介:XXL-JOB是一个分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展.作者是大众点评的许雪里.目前最新版本为v2.x.2.特性功能:1、简单:支持通过Web页面对任务进行CRUD操作,操作简单,一分钟上手;2、动态:支......
  • 分布式应用开发的核心技术系列之——基于TCP/IP的原始消息设计
    本文由葡萄城技术团队原创并首发。转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。前言本文的内容主要围绕以下几个部分:TCP/IP的简单介绍。消息的介绍。基于消息分类的传输格式(流类型和XML类型)。消息体系的组成。TCP/IP的简单......
  • 浅谈分布式事务及解决方案
    1背景在讲述分布式事务的概念之前,我们先来回顾下事务相关的一些概念。1.1事务的基本概念就是一个程序执行单元,里面的操作要么全部执行成功,要么全部执行失败,不允许只成功一半另外一半执行失败的事情发生。例如一段事务代码做了两次数据库更新操作,那么这两次数据库操作要么全部......
  • 浅谈分布式事务及解决方案 | 京东物流技术团队
    1背景在讲述分布式事务的概念之前,我们先来回顾下事务相关的一些概念。1.1事务的基本概念就是一个程序执行单元,里面的操作要么全部执行成功,要么全部执行失败,不允许只成功一半另外一半执行失败的事情发生。例如一段事务代码做了两次数据库更新操作,那么这两次数据库操作要么全部执行......
  • Git 分布式版本控制工具
    1.前言1.1什么是GitGit是一个分布式版本控制工具,主要用于管理开发过程中的源代码文件(Java类、xml文件、html页面等),在软件开发过程中被广泛使用。其他的版本控制工具软件:SVNCVSVSS1.2使用Git能做什么代码回溯:Git在管理文件过程中会记录日志,方便回退到历史版本版本切换:Git存在分支......
  • SAGA分布式
    Saga是由一系列的本地事务构成。每一个本地事务在更新完数据库之后,会发布一条消息或者一个事件来触发Saga中的下一个本地事务的执行。如果一个本地事务因为某些业务规则无法满足而失败,Saga会执行在这个失败的事务之前成功提交的所有事务的补偿操作。Saga的实现有很多种方式,其中最......