淘宝开源分布式调度系统TBSchedule详解

Console下载:trunk/console/ScheduleConsole.war

技术支持:忌少 jishao@taobao.com

推荐项目:QLExpress 简介高效的脚本引擎

pom引用:

com.taobao.pamirs.schedule

tbschedule

3.2.6

3.0-QuickStart

使用的问题解答

重要更新

tbschedule

此文档内部包括:

1、设计目标说明

2、主要概念解释

3、涉及的数据对象说明

4、涉及的业务接口说明

5、Sleep模式和NotSleep模式的区别

6、使用过程中的注意事项

1、调度器的设计目标

1、tbschedule的目的是让一种批量任务或者不断变化的任务,能够被动态的分配到多个主机的JVM中,不同的线程组中并行执行。所有的任务能够被不重复,不遗漏的快速处理。

2、调度的Manager可以动态的随意增加和停止

3、可以通过JMX控制调度服务的创建和停止

4、可以指定调度的时间区间:

PERMIT_RUN_START_TIME :允许执行时段的开始时间crontab的时间格式.以startrun:开始,则表示开机立即启动调度

PERMIT_RUN_END_TIME :允许执行时段的结束时间crontab的时间格式,如果不设置,表示取不到数据就停止

PERMIT_RUN_START_TIME ='0 * * * * ?' 表示在每分钟的0秒开始

PERMIT_RUN_START_TIME ='20 * * * * ?' 表示在每分钟的20秒终止

就是每分钟的0-20秒执行,其它时间休眠

格式信息请参照:http://dogstar.javaeye.com/blog/116130

2、主要概念

TaskType任务类型:

是任务调度分配处理的单位,例如:

1、将一张表中的所有状态为STS=’N’的所有数据提取出来发送给其它系统,同时将修改状态STS=’Y’,就是一种任务。TaskType=’DataDeal’

2、将一个目录以所有子目录下的所有文件读取出来入库,同时把文件移到对应的备份目录中,也是一种任务。TaskType=’FileDeal’。

3、可以为一个任务类型自定义一个字符串参数由应用自己解析。例如:"AREA=杭州,YEAR>30"

ScheduleServer任务处理器

1、是由一组线程【1..n个线程】构成的任务处理单元,每一任务处理器有一个唯一的全局标识,

一般以IP$UUID[例如192.168.1.100$0C78F0C0FA084E54B6665F4D00FA73DC]的形式出现。 一个任务类型的数据可以由1..n个任务处理器同时进行。

2、这些任务处理器可以在同一个JVM中,也可以分布在不同主机的JVM中。任务处理器内部有一个心跳线程,用于确定Server的状态和任务的动态分配,

有一组工作线程,负责处理查询任务和具体的任务处理工作。

3、目前版本所有的心跳信息都是存放在Zookeeper服务器中的,所有的Server都是对等的,当一个Server死亡后,其它Server会接管起拥有的任务队列,

期间会有几个心跳周期的时延。后续可以用类似ConfigerServer类的存储。

4、现有的工作线程模式分为Sleep模式和NotSleep模式。缺省是缺省是NOTSLEEP模式。在通常模式下,在通常情况下用Sleep模式。

在一些特殊情况需要用NotSleep模式。两者之间的差异在后续进行描述。

TaskItem任务项

是对任务进行的分片划分。例如:

1、将一个数据表中所有数据的ID按10取模,就将数据划分成了0、1、2、3、4、5、6、7、8、9供10个任务项。

2、将一个目录下的所有文件按文件名称的首字母(不区分大小写),

就划分成了A、B、C、D、E、F、G、H、I、J、K、L、M、N、O、P、Q、R、S、T、U、V、W、X、Y、Z供26个队列。

3、将一个数据表的数据ID哈希后按1000取模作为最后的HASHCODE,我们就可以将数据按[0,100)、[100,200) 、[200,300)、[300,400) 、

[400,500)、[500,600)、[600,700)、[700,800)、[800,900)、 [900,1000)划分为十个任务项,当然你也可以划分为100个任务项,最多是1000个任务项。

任务项是进行任务分配的最小单位。一个任务项只能由一个ScheduleServer来进行处理。但一个Server可以处理任意数量的任务项。

例如任务被划分为了10个队列,可以只启动一个Server,所有的任务项都有这一个Server来处理;也可以启动两个Server,每个Sever处理5个任务项;

但最多只能启动10个Server,每一个ScheduleServer只处理一个任务项。如果在多,则第11个及之后的Server将不起作用,处于休眠状态。

4、可以为一个任务项自定义一个字符串参数由应用自己解析。例如:"TYPE=A,KIND=1"

TaskDealBean任务处理类

是业务系统进行数据处理的实现类。要求实现Schedule的接口IScheduleTaskDealMulti或者IScheduleTaskDealSingle。

接口主要包括两个方法。一个是根据调度器分配到的队列查询数据的接口,一个是进行数据处理的接口。

运行时间

1、可以指定任务处理的时间间隔,例如每天的1:00-3:00执行,或者每个月的第一天执行、每一个小时的第一分钟执行等等。

间格式与crontab相同。如果不指定就表示一致运行。PERMIT_RUN_START_TIME,PERMIT_RUN_END_TIME

2、可以指定如果没有数据了,休眠的时间间隔。SLEEP_TIME_NODATA 单位秒

3、可以指定每处理完一批数据后休眠的时间间隔.SLEEP_TIME_INTERVAL 单位

OwnSign环境区域

是对运行环境的划分,进行调度任务和数据隔离。例如:开发环境、测试环境、预发环境、生产环境。

不同的开发人员需要进行数据隔离也可以用OwnSign来实现,避免不同人员的数据冲突。缺省配置的环境区域OwnSign='BASE'。

例如:TaskType='DataDeal',配置的队列是0、1、2、3、4、5、6、7、8、9。缺省的OwnSign='BASE'。

此时如果再启动一个测试环境,则Schedule会动态生成一个TaskType='DataDeal-Test'的任务类型,环境会作为一个变量传递给业务接口,

由业务接口的实现类,在读取数据和处理数据的时候进行确定。业务系统一种典型的做法就是在数据表中增加一个OWN_SIGN字段。

在创建数据的时候根据运行环境填入对应的环境名称,在Schedule中就可以环境的区分了。

调度策略

是指某一个任务在调度集群上的分布策略,可以制定:

1、可以指定任务的机器IP列表。127.0.0.1和localhost表示所有机器上都可以执行

2、可以指定每个机器上能启动的线程组数量,0表示没有限制

3、可以指定所有机器上运行的线程组总数。

3、业务接口说明

包含三个业务接口,:

1、IScheduleTaskDeal 调度器对外的基础接口,是一个基类,并不能被直接使用

2、IScheduleTaskDealSingle 单任务处理的接口,继承 IScheduleTaskDeal

3、IScheduleTaskDealMulti 可批处理的任务接口,继承 IScheduleTaskDeal

IScheduleTaskDeal 调度器对外的基础接口

public interface IScheduleTaskDeal {

/**

* 根据条件,查询当前调度服务器可处理的任务

* @param taskParameter 任务的自定义参数

* @param ownSign 当前环境名称

* @param taskQueueNum 当前任务类型的任务队列数量

* @param taskQueueList 当前调度服务器,分配到的可处理队列

* @param eachFetchDataNum 每次获取数据的数量

* @return

* @throws Exception

*/

public List selectTasks(String taskParameter,String ownSign,int taskQueueNum,List taskItemList,int eachFetchDataNum) throws Exception;

/**

* 获取任务的比较器,只有在NotSleep模式下需要用到

* @return

*/

public Comparator getComparator();

}

IScheduleTaskDealSingle 单任务处理的接口

public interface IScheduleTaskDealSingle extends IScheduleTaskDeal {

/**

* 执行单个任务

* @param task Object

* @param ownSign 当前环境名称

* @throws Exception

*/

public boolean execute(T task,String ownSign) throws Exception;

}

IScheduleTaskDealMulti 可批处理的任务接口

public interface IScheduleTaskDealMulti  extends IScheduleTaskDeal {

/**

* 执行给定的任务数组。因为泛型不支持new 数组,只能传递OBJECT[]

* @param tasks 任务数组

* @param ownSign 当前环境名称

* @return

* @throws Exception

*/

public boolean execute(Object[] tasks,String ownSign) throws Exception;

}

4、Sleep模式和NotSleep模式的区别

1、ScheduleServer启动的工作线程组线程是共享一个任务池的。

2、在Sleep的工作模式:当某一个线程任务处理完毕,从任务池中取不到任务的时候,检查其它线程是否处于活动状态。如果是,则自己休眠;

如果其它线程都已经因为没有任务进入休眠,当前线程是最后一个活动线程的时候,就调用业务接口,获取需要处理的任务,放入任务池中,

同时唤醒其它休眠线程开始工作。

3、在NotSleep的工作模式:当一个线程任务处理完毕,从任务池中取不到任务的时候,立即调用业务接口获取需要处理的任务,放入任务池中。

4、Sleep模式在实现逻辑上相对简单清晰,但存在一个大任务处理时间长,导致其它线程不工作的情况。

5、在NotSleep模式下,减少了线程休眠的时间,避免大任务阻塞的情况,但为了避免数据被重复处理,增加了CPU在数据比较上的开销。

同时要求业务接口实现对象的比较接口。

6、如果对任务处理不允许停顿的情况下建议用NotSleep模式,其它情况建议用sleep模式。

5、使用过程中的注意事项(待续)

其他可以参考的内容

我:

https://yun.baidu.com/share/home?uk=2214641459&view=share#category/type=0

我:

https://my.oschina.net/treeHeartPig/blog/841775

我:

http://www.cnblogs.com/lengfo/p/4146797.html

我:

http://blog.csdn.net/neutrojan/article/details/9109657

我:

http://code.taobao.org/p/tbschedule/wiki/index/

2.字段 允许值 允许的特殊字符

3.秒 0-59 , - * /

4.分 0-59 , - * /

5.小时 0-23 , - * /

6.日期 1-31 , - * ? / L W C

7.月份 1-12 或者 JAN-DEC , - * /

8.星期 1-7 或者 SUN-SAT , - * ? / L C #

9.年(可选) 留空, 1970-2099 , - * /

10.表达式意义

秒 分 时  日 月 星 年

11."0 0 12 * * ?" 每天中午12点触发

12."0 15 10 ? * *" 每天上午10:15触发

13."0 15 10 * * ?" 每天上午10:15触发

14."0 15 10 * * ? *" 每天上午10:15触发

15."0 15 10 * * ? 2005" 2005年的每天上午10:15触发

16."0 * 14 * * ?" 在每天下午2点到下午2:59期间的每1分钟触发

17."0 0/5 14 * * ?" 在每天下午2点到下午2:55期间的每5分钟触发

18."0 0/5 14,18 * * ?" 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发

19."0 0-5 14 * * ?" 在每天下午2点到下午2:05期间的每1分钟触发

20."0 10,44 14 ? 3 WED" 每年三月的星期三的下午2:10和2:44触发

21."0 15 10 ? * MON-FRI" 周一至周五的上午10:15触发

22."0 15 10 15 * ?" 每月15日上午10:15触发

23."0 15 10 L * ?" 每月最后一日的上午10:15触发

24."0 15 10 ? * 6L" 每月的最后一个星期五上午10:15触发

25."0 15 10 ? * 6L 2002-2005" 2002年至2005年的每月的最后一个星期五上午10:15触发

26."0 15 10 ? * 6#3" 每月的第三个星期五上午10:15触发

27.每天早上6点

28.0 6 * * *

29.每两个小时

30.0 */2 * * *

31.晚上11点到早上8点之间每两个小时,早上八点

32.0 23-7/2,8 * * *

33.每个月的4号和每个礼拜的礼拜一到礼拜三的早上11点

34.0 11 4 * 1-3

35.1月1日早上4点

36.0 4 1 1 *

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

推荐阅读更多精彩内容