开源信息:分布式任务执行框架micro-job v0.0.1.RELEASE版本发布

源码位置:

GitHubhttps://github.com/hengyuboy/spring-boot-starter-micro-job
码云https://gitee.com/hengboy/spring-boot-starter-micro-job

基本介绍

micro-job是一款轻量级的分布式任务执行框架,内部集成了quartz框架来完成任务的分布式调度,quartz是一个强大的任务执行框架,但是quartz为我们提供的功能却是有限,我们较为关心的执行日志采集任务失败重试任务权重调度等在原生的quartz框架内实现会较为麻烦。

架构设计模式

micro-job采用了servernode的概念进行编写。

  • server一般就是我们的业务端,是发起创建定时任务的模块,我们可以通过注入内置的JobExecuteService类进行对Job的基本操作。

  • node是任务执行的节点,是执行发起定时任务逻辑的模块,当server发起了任务后,会直接通过RPC框架的NIO协议通信给node,接收到任务执行的任务节点执行完成后将结果反馈给server

    具体在执行时选择的任务节点是什么,完全根据配置的负载执行策略

最新版本说明

  • v0.0.1.RELEASE (2019-1-21发布)
    • 任务上报
    • 自动执行
    • ipHash负载执行策略
    • 平滑轮询权重负载执行策略
    • 随机权重负载执行策略
    • 自动重连
    • 心跳检查
    • 任务重试
    • 任务操作

任务上报

node节点启动完成后会自动扫描本项目内实现JobTrigger接口的类,一同携带node节点的网络信息通过心跳的方式发送给serverserver接收到后会将相应的信息进行持久化到数据库。

自动执行

自动执行是指任务上报后就会自动执行任务,根据配置在JobTrigger实现类上的注解@Job内的autoStart属性进行决定的,如果该属性配置true并且通过cron属性配置了cron任务表达式,那么在任务上报完成后会自动在server通过JobExecuteService来进行启动任务。

ipHash负载执行策略

micro-job内提供了三种负载执行策略,ip-hash是其中的一种,这种负载均衡策略一般在相同任务在多个执行node下才能够更好的提现出来,如果你的任务执行node较少,建议采用轮询权重策略

该策略根据执行任务@Job配置属性的jobKeyhashCode值来自动就近分配

在负载均衡选择执行node时会把jobKey所绑定的所有nodeip:port信息的hash值通过SortedMap进行排序处理,如果jobKeyhash值大于所有节点的最大值时,返回最大hash的任务执行node,否则通过tailMap返回就近的任务执行node

平滑轮询权重负载执行策略

轮询权重负载策略在之前就被广大的应用,最大特点是可以根据权重任意配置某一个节点的执行的次数,你可以根据每一个node的承受压力的能力进行均衡配置。

如果相同jobKey的两个任务执行node策略配置相同,则会轮流执行。

权重可以通过@Job注解的weight属性进行配置,默认为:1

随机权重负载执行策略

这种策略其实跟ip-hash有一部分是差不多的

在初始化负载执行节点时,随机的权重会根据上一个节点权重+当前节点的权重作为新的权重值,然后通过最后放入集合节点的权重 * Math.random()方法进行获取随机权重值,通过tailMap返回的SortedMap的集合获取随机权重最近值的第一个作为本次随机出来的执行节点

自动重连

重连有两种模式

  1. node断开重连

    如果node断开后,server会检查超过10秒未心跳检查的node的列表进行剔除,剔除时会自动断开与nodeNIO连接。

    node发起第一次心跳检查时,又会自动的创建与nodeNIO连接。

  2. server断开重连

    如果server断开后,node都会不停的重试与server连接,当server启动后收到node发起心跳请求后,server会将该node信息持久化到内存以及数据库

心跳检查

心跳检查是一个server/node模式的基本设计,保持两端的心跳连接才能更好地进行通信,server在执行定时任务时至少在较短时间内保证node是有效的,当然也不能保证完全的node有效,所以我们才应该有了下面的任务重试机制

任务重试

任务重试场景比较多,下面是一个简单的场景:

任务执行时负载分配到了node1,如果node1这时停止了,或者出现了网络超时的问题,导致任务执行失败,这时任务JobTrigger.exexute方法就会返回JobExecuteResult.JOB_EXECUTE_RETRY,这时server得到反馈后就会写入重试的Queue内,然后通过线程自动读取Queue内等待重试的任务再次负载分配执行node进行执行,从而实现了任务重试机制。

任务操作

任务操作目前可以通过注入JobExecuteService类来进行,通过该类提供的对应的方法进行操作任务的启动删除暂停判断是否存在等。

开始使用

micro-job已经上传到maven center中央仓库,所以我们可以通过mavengradle等中央仓库支持的依赖方式就可以进行添加依赖。

工程依赖

这里是maven方式的依赖方式示例,如果你是其他方式,请访问spring-boot-starter-micro-job仓库地址,查看对应版本的依赖方式。

服务端依赖

<dependency>
  <groupId>com.gitee.hengboy</groupId>
  <artifactId>spring-boot-starter-micro-job-server</artifactId>
  <version>{lastVersion}</version>
</dependency>

任务节点依赖

<dependency>
  <groupId>com.gitee.hengboy</groupId>
  <artifactId>spring-boot-starter-micro-job-node</artifactId>
  <version>{lastVersion}</version>
</dependency>

依赖时建议采用最新的版本,把lastVersion更换为maven center内最新版本。

数据库初始化

我们通过集成quartzJDBC方式进行封装,在quartz的基础表上进行了扩展,具体的表结构在项目的工程下的schema_mysql.sql文件内,这个脚本可以在MySQLMariaDB数据库内直接执行,其他数据库版本待整理!

注意:v0.0.1.RELEASE版本目前使用项目的数据源进行操作任务相应的数据库表信息,暂时不支持单独的数据源。

常见问题

  1. 怎么修改执行策略?

    可以通过修改@Job注解的strategy属性就行修改,该属性所属的值为LoadBalanceStrategy枚举实例。

  2. 怎么开启自动执行?

    通过修改@Job注解的autoStart属性修改,配置true时任务上报后就会自动执行,默认为:false

  3. JobKey生成的规则是什么?

    JobKey默认使用@Job注解的jobKey属性,如果并未配置则使用配置@Job注解JobTrigger实现类的类名首字母小写来配置。

  4. 任务怎么动态删除?

    目前有两种方式:

    • 使用JobExecuteServiceremove方法来根据jobKey进行删除
    • 如果是在JobTrigger实现类内的execute方法内进行删除,直接return JobExecuteResult.JOB_EXECUTE_REMOVE;会在本次任务执行后删除。
  5. 任务重试次数怎么配置?

    server端的application.ymlapplication.properties文件内进行配置hengboy.job.server.retry-times参数的值即可,默认为:2

  6. 任务的重试次数怎么计算?

    任务在执行的时,如果存在该任务绑定的执行node,并且本次执行并未成功就会被计入消耗1次重试次数,当然如果node执行后返回JobExecuteResult.JOB_EXECUTE_RETRY也不会计算次数。

  7. 支持一次性执行任务吗?

    目前可以TriggerJob实现类方法execute通过JobExecuteResult.JOB_EXECUTE_REMOVE删除任务的方式来进行一次性执行。

  8. 更多问题请issuse

配置参数列表

server配置

hengboy:
  job:
    server:
      heart-check-time: 5
      retry-times: 5
      heart-check-over-time: 10
      reg-port: 9999
  • heart-check-time:心跳检查剔除间隔执行的时间,单位:秒,默认为:5秒
  • retry-times:配置任务重试的次数,超过重试次数会丢弃任务,默认为:2次
  • heart-check-over-time:心跳检查剔除的超时时长,单位:秒,如配置超时10秒后就会被剔除,默认为10秒
  • reg-port:server的监听的端口号,默认为9999

client 配置

hengboy:
  job:
    node:
      local-port: 9997
      reg-address: 192.168.1.75
      reg-port: 9999
      request-timeout: 5000
      job-base-package: com.gitee.hengboy.job.node.demo
      send-heart-sync-time: 5
      send-heart-initial-delay: 5
  • local-port:node的端口号,该端口号会上报到server
  • reg-address:serverIP地址,默认为:127.0.0.1
  • reg-port:server的绑定端口号,默认为:9999
  • request-timeout:NIO执行超时时间,单位:毫秒,默认:5000毫秒
  • job-base-package:扫描JobTrigger实现类的base package,如果不配置则采用SpringBoot默认的base package
  • send-heart-sync-time:发送心跳检查的间隔执行事件,单位:秒,默认:5秒
  • send-heart-initial-delay:node启动后延时心跳的时间,单位:秒,默认:5秒

如果存在默认值的相关参数,无需在配置文件内配置。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,776评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,527评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,361评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,430评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,511评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,544评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,561评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,315评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,763评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,070评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,235评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,911评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,554评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,173评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,424评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,106评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,103评论 2 352

推荐阅读更多精彩内容