阿里巴巴分布式调度引擎tbschedule实战四tbschedule的配置使用

今天开始我们的实战配置的章节。代码我共享在qq群里了!751124494。

业务场景介绍

先把我们的业务场景介绍下,这里有两张表user_detail  是源数据表user_detail_copy   是备份数据表,场景是这样的将源数据表的数据实时的同步到另外一张备份表,我们这个场景不是定时的,而是实时执行的!下面介绍下test-tbschedule的代码, test-tbschedule 这是我们的业务系统,里面封装了表备份的任务逻辑,使用tbschedule来实现分布式作业!~入口启动类就是main,任务逻辑都封装在demotask这个类里了。上一章节介绍过demotask类了!这个类继承了tbschedule的接口IScheduleTaskDealSingle

tbschedule的使用介绍

使用tbschedule操作的顺序我已经画了一张图!

阿里巴巴分布式调度引擎tbschedule实战四tbschedule的配置使用

首先

1:在管控台创建我们的策略和任务数据(主攻发布任务,军事针对任务发布策略)

这里又细分为三步。第一配置zk,初始化根目录。我们的管控台需要链接zk。就跟我们的系统要连数据库是一个道理。

进入我们的管控台登陆页面http://localhost:8080这个是基础信息配置页面。

配置Zookeeper地址加端口号,配置Zookeeper超时时间。毫秒为单位。配置Zookeeper根目录,管控台会在zk中初始一个根节点。就是这个根目录,Zookeeper用户密码是指为我们当前的根节点设置一个账号密码

配置zk的账号密码—>点管理主页。好了。这就是我们的第一步。

阿里巴巴分布式调度引擎tbschedule实战四tbschedule的配置使用

在配置任务和策略之前!我们先来理解下任务,策略,机器。这三个名词术语之间的关系!!这些是tbschedule里针对分布式去调度任务封装出来的角色!我们来简单理解下这三个名次。打个生活化的比喻!

古代赵大王发出攻打A城池的任务!攻打A城池的任务被细分为攻打正门,后门,西门!三个门,这就是任务拆分,军师根据攻打A城池的任务指定了一个策略!这个策略就是指定了完成这个攻打A城池的士兵数量。也就等同于我们的线程。对应着tbschedule的调度器!士兵打仗肯定是需要将领来带领的。将领就等同于我们的机器!如果只有一个将领的话。三个门只能一个个攻陷。有三个将领的话。三个门就能同时发起战斗。完成任务的效率更高

这个策略还包含怎么去给现有的将领分配士兵和被拆分出来的小任务。

军师很强大。使用一套完美的算法!这个分配是一个动态的过程。不管将军的多少!这个策略都能通用!

好了。回到我们现实的的场景中来!备份表这个大的任务就是赵大王发布的任务。任务会被细分。也就是tbschedule任务分片。比如说当前场景有100w条数据。被分成了30w,30w,40w。3个小任务。策略呢?就是指定完成我们这个任务的线程数量!

机器就是我们的将领了。负责带动线程攻陷三个小任务。

好了,理解了,机器,任务,策略这些名词之间的关系。下面开始我们的任务的配置!

下面我们来录入我们的配置数据

首先我们要发布任务对吧?点任务管理->点创建新任务,配置很多!

阿里巴巴分布式调度引擎tbschedule实战四tbschedule的配置使用

我们来一个个看看它的意思

任务名称:给你的任务取一个名称。就叫copyTask吧

任务处理的SpringBean:这个就是我们demotask的spring的ID,demoTaskBean

心跳频率(秒):这个是tbschedule集群的心跳检测。通过心跳来检查调度器是否健康运行!现在不大明白没关系。源码章节我们会对这个心跳检测做详细的分析,我们就用默认的

5.0秒

假定服务死亡间隔(秒): 这个就是判定我们的调度器是否死亡的一个阀值。超过60秒没有心跳。就判定这个调度器死掉了。使用默认的60.0s

线程数:这个线程数是指调度器里创建多少个线程,调度器可以理解为是一个多线程的集合,线程组。我们使用默认的5.每个调度器创建5个线程

处理模式:第一课我们讲到后台任务解决方案的时候。举出了一个最简单的方案,while true组合sleep模式!其实tbschedule底层也是这样写的。只不过多了很多集群容错代码。SLEEP模式代表没有查找到数据时。线程睡眠一会,还有一个NOTSLEEP。指的是线程没有查到数据。不睡眠。自旋运行等待

每次获取数据量:这个是指我们每次查数据的条数!相当于一个分页查询。每次执行selectTasks方法的查找500条数据,使用默认

每次执行数量:1只在bean实现IScheduleTaskDealMulti才生效,这个无效参数

没有数据时休眠时长(秒):0.5 这个是配合我们前面配置的SLEEP模式来使用的

每次处理完数据后休眠时间(秒):0.0

执行开始时间:

执行结束时间:这两个是定时任务的配置。我们当前场景任务是个实时任务场景,源码章节会对定时任务的底层实现做个详细的阐述

单线程组最大任务项: 0。。

每一组线程能分配的最大任务数量,避免在随着机器的减少把正常的服务器压死,0或者空表示不限制

自定义参数(字符串): 针对我们的任务传递一个参数。这个对应着我们的selectTasks方法的形参taskParameter,这个我们不配

任务项(“,”分隔):这是一个很重要的参数!前面我们讲了任务会做拆分!我们需要tbschedule我们的拆分规则就可以了!这里就是告诉我们tbschedule我们任务的拆分规则

我先配置。然后再来解释这个配置的意思!

0:{0},1:{1},2:{2},3:{3},4:{4},5:{5},6:{6},7:{7},8:{8},9:{9} 。

看看下面的任务项的说明

举出了4种任务分片的规则。

1很好理解,如果你的id是数值型的。id/小任务数量取模 任务id用这些余数来定义!我们现在用的就是这种分片规则

2是指文件目录,以目录名的第一个字母来分片。

3:你的id可能不是数值型的,要将id先哈希。再取模1000

回过来解释下我们的任务拆分规则。我们用的是第一种。按照id来取模。这里呢!我们将任务拆分成10个小任务。我们来看这个拆分表达式

我们定义了10个小任务。每个小任务用逗号分隔开。每个小任务包含两个属性。任务id。就是这个0。打括号里面的呢是小任务参数。

我们可以理解这10个小任务是一个数组!小任务的参数可以理解为这个数组的索引位置。数据库主键的id/10取余数来寻我数据应该放在数组哪个位置!明白了吗?第一个小任务的条件参数为0.什么意思?意思就是说。id/10取余结果为0的数据。都属于这个小任务。后面都是一个意思。条件参数最后会传入到我们代码selectTasks方法形参queryCondition里。它是一个list类型

阿里巴巴分布式调度引擎tbschedule实战四tbschedule的配置使用好了。任务配置结束了。点保存,至此。赵大王的攻城的任务发布完成

下面该配置我们的策略了。

点我们的调度策略->

阿里巴巴分布式调度引擎tbschedule实战四tbschedule的配置使用

策略名称:copyData-strategry

任务类型:Schedule。使用默认的。目前tbschedule只有这一种实现

任务名称:注意这个。我们的任务和策略是一一对应的。需要通过一个属性关联起来。就是通过这个任务名称来关联的。所以这里的任务名称必须和我们前面的任务名称一致copyTask。这里可以输入两个属性啊!一个任务名称。还有一个环境名。任务名称$环境名,tbschedule会通过$来拆分的.环境名对应着demotask里的selecttask方法的形参ownSign。它会给你传过去!具体要查哪个环境的数据。是测试环境还是正式环境。你自己通过判断这个参数来判断。如果你不写。默认的就是BASE

任务参数: 对任务类型为Schedule的无效。不用管这个配置

单JVM最大线程组数量:1个jvm就代表我们一个机器。它最高能启动多少个调度器。这是个阀值,0代表不限制!我们不限制

最大线程组数量:就是我们针对这个任务总共要创建多少个调度器来完成这个任务。你写5.tbschedule就创建5个调度器。

IP地址(逗号分隔):白名单。在这个名单下的ip地址才可以运行任务,127.0.0.1或者localhost会允许所有机器上运行。我们允许所有机器

好了。我们的策略数据也配置完了

下面应该是进入我们调度作业的使用流程了

1:在业务系统引入相应的jar包。

我们pom.xml有引入tbschedule-core工程!注意一点。这里我们是引入我们本地的core工程!不是从maven仓库中下载过来的jar包

2:在业务系统实现tbschedule业务接口

来看我们的demotask,这个类实现了tbschedule的业务接口,tbschedule也是通过这个接口来调度我们的业务代码的。来看下相关的代码,实现IScheduleTaskDealSingle接口,

是个单个任务处理的接口,意思是你的数据会被一条条的执行,这个接口主要定义了三个方法selectTasks,execute,Comparator。这个我们前面已经介绍过了啊。查数据的逻辑就写在selectTasks中。

将查出来的数据插入到备份表中去,这个的逻辑写在execute中执行。

selectTasks执行的返回值tbschedule会放到一个队列里去,tbschedule会不停的从这个队列中取出数据调度执行execute方法.IScheduleTaskDealSingle接口的是从队列中一条条的拿出来执行,Comparator接口是过滤,后面再讲,这些方法的形参我们前面基本已经都介绍过了。eachFetchDataNum 这是个分页参数。对应着我们任务配置的每次获取的数量

 

3:在业务系统编写启动类并启动

main是启动类,启动我们的调度作业的入口类,我们来看看这个代码

核心操作类是tbschedule的TBScheduleManagerFactory。调度管理器。调用init初始化方法,rootPath,  这个根目录和我们前面管控台配置的根目录保持一致,接触过zk的同学都知道zk是一个树形结构来存储文件的,如果没有接触过zk的就把它理解为mysql里的一个库吧!!这个库里有策略表,任务表,机器表。这里启动起来。让它创建我们的根目录。下一步启动管控台配参数的时候要需要依赖这个根目录!