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. 是任务调度分配处理的单位,例如:
  2. 1、将一张表中的所有状态为STS=’N’的所有数据提取出来发送给其它系统,同时将修改状态STS=’Y’,就是一种任务。TaskType=’DataDeal
  3. 2、将一个目录以所有子目录下的所有文件读取出来入库,同时把文件移到对应的备份目录中,也是一种任务。TaskType=’FileDeal’。
  4. 3、可以为一个任务类型自定义一个字符串参数由应用自己解析。例如:"AREA=杭州,YEAR>30"

ScheduleServer任务处理器

  1. 1、是由一组线程【1..n个线程】构成的任务处理单元,每一任务处理器有一个唯一的全局标识,
  2. 一般以IP$UUID[例如192.168.1.100$0C78F0C0FA084E54B6665F4D00FA73DC]的形式出现。 一个任务类型的数据可以由1..n个任务处理器同时进行。
  3. 2、这些任务处理器可以在同一个JVM中,也可以分布在不同主机的JVM中。任务处理器内部有一个心跳线程,用于确定Server的状态和任务的动态分配,
  4. 有一组工作线程,负责处理查询任务和具体的任务处理工作。
  5. 3、目前版本所有的心跳信息都是存放在Zookeeper服务器中的,所有的Server都是对等的,当一个Server死亡后,其它Server会接管起拥有的任务队列,
  6. 期间会有几个心跳周期的时延。后续可以用类似ConfigerServer类的存储。
  7. 4、现有的工作线程模式分为Sleep模式和NotSleep模式。缺省是缺省是NOTSLEEP模式。在通常模式下,在通常情况下用Sleep模式。
  8. 在一些特殊情况需要用NotSleep模式。两者之间的差异在后续进行描述。

TaskItem任务项

  1. 是对任务进行的分片划分。例如:
  2. 1、将一个数据表中所有数据的ID10取模,就将数据划分成了012345678910个任务项。
  3. 2、将一个目录下的所有文件按文件名称的首字母(不区分大小写),
  4. 就划分成了ABCDEFGHIJKLMNOPQRSTUVWXYZ26个队列。
  5. 3、将一个数据表的数据ID哈希后按1000取模作为最后的HASHCODE,我们就可以将数据按[0,100)、[100,200) 、[200,300)、[300,400)
  6. [400,500)、[500,600)、[600,700)、[700,800)、[800,900)、 [900,1000)划分为十个任务项,当然你也可以划分为100个任务项,最多是1000个任务项。
  7. 任务项是进行任务分配的最小单位。一个任务项只能由一个ScheduleServer来进行处理。但一个Server可以处理任意数量的任务项。
  8. 例如任务被划分为了10个队列,可以只启动一个Server,所有的任务项都有这一个Server来处理;也可以启动两个Server,每个Sever处理5个任务项;
  9. 但最多只能启动10Server,每一个ScheduleServer只处理一个任务项。如果在多,则第11个及之后的Server将不起作用,处于休眠状态。
  10. 4、可以为一个任务项自定义一个字符串参数由应用自己解析。例如:"TYPE=A,KIND=1"

TaskDealBean任务处理类

  1. 是业务系统进行数据处理的实现类。要求实现Schedule的接口IScheduleTaskDealMulti或者IScheduleTaskDealSingle
  2. 接口主要包括两个方法。一个是根据调度器分配到的队列查询数据的接口,一个是进行数据处理的接口。

运行时间

  1. 1、可以指定任务处理的时间间隔,例如每天的100300执行,或者每个月的第一天执行、每一个小时的第一分钟执行等等。
  2. 间格式与crontab相同。如果不指定就表示一致运行。PERMIT_RUN_START_TIME,PERMIT_RUN_END_TIME
  3. 2、可以指定如果没有数据了,休眠的时间间隔。SLEEP_TIME_NODATA 单位秒
  4. 3、可以指定每处理完一批数据后休眠的时间间隔.SLEEP_TIME_INTERVAL 单位

OwnSign环境区域

  1. 是对运行环境的划分,进行调度任务和数据隔离。例如:开发环境、测试环境、预发环境、生产环境。
  2. 不同的开发人员需要进行数据隔离也可以用OwnSign来实现,避免不同人员的数据冲突。缺省配置的环境区域OwnSign='BASE'
  3. 例如:TaskType='DataDeal',配置的队列是0123456789。缺省的OwnSign='BASE'
  4. 此时如果再启动一个测试环境,则Schedule会动态生成一个TaskType='DataDeal-Test'的任务类型,环境会作为一个变量传递给业务接口,
  5. 由业务接口的实现类,在读取数据和处理数据的时候进行确定。业务系统一种典型的做法就是在数据表中增加一个OWN_SIGN字段。
  6. 在创建数据的时候根据运行环境填入对应的环境名称,在Schedule中就可以环境的区分了。

调度策略
是指某一个任务在调度集群上的分布策略,可以制定:
1、可以指定任务的机器IP列表。127.0.0.1和localhost表示所有机器上都可以执行
2、可以指定每个机器上能启动的线程组数量,0表示没有限制
3、可以指定所有机器上运行的线程组总数。

3、业务接口说明

包含三个业务接口,:
1、IScheduleTaskDeal 调度器对外的基础接口,是一个基类,并不能被直接使用
2、IScheduleTaskDealSingle 单任务处理的接口,继承 IScheduleTaskDeal
3、IScheduleTaskDealMulti 可批处理的任务接口,继承 IScheduleTaskDeal

IScheduleTaskDeal 调度器对外的基础接口

  1. public interface IScheduleTaskDeal<T> {
  2. /**
  3. * 根据条件,查询当前调度服务器可处理的任务
  4. * @param taskParameter 任务的自定义参数
  5. * @param ownSign 当前环境名称
  6. * @param taskQueueNum 当前任务类型的任务队列数量
  7. * @param taskQueueList 当前调度服务器,分配到的可处理队列
  8. * @param eachFetchDataNum 每次获取数据的数量
  9. * @return
  10. * @throws Exception
  11. */
  12. public List<T> selectTasks(String taskParameter,String ownSign,int taskQueueNum,List<TaskItemDefine> taskItemList,int eachFetchDataNum) throws Exception;
  13.  
  14. /**
  15. * 获取任务的比较器,只有在NotSleep模式下需要用到
  16. * @return
  17. */
  18. public Comparator<T> getComparator();
  19. }

IScheduleTaskDealSingle 单任务处理的接口

  1. public interface IScheduleTaskDealSingle<T> extends IScheduleTaskDeal<T> {
  2. /**
  3. * 执行单个任务
  4. * @param task Object
  5. * @param ownSign 当前环境名称
  6. * @throws Exception
  7. */
  8. public boolean execute(T task,String ownSign) throws Exception;
  9.  
  10. }

IScheduleTaskDealMulti 可批处理的任务接口

  1. public interface IScheduleTaskDealMulti<T> extends IScheduleTaskDeal<T> {
  2.  
  3. /**
  4. * 执行给定的任务数组。因为泛型不支持new 数组,只能传递OBJECT[]
  5. * @param tasks 任务数组
  6. * @param ownSign 当前环境名称
  7. * @return
  8. * @throws Exception
  9. */
  10. public boolean execute(Object[] tasks,String ownSign) throws Exception;
  11. }

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

  1. 1ScheduleServer启动的工作线程组线程是共享一个任务池的。
  2. 2、在Sleep的工作模式:当某一个线程任务处理完毕,从任务池中取不到任务的时候,检查其它线程是否处于活动状态。如果是,则自己休眠;
  3. 如果其它线程都已经因为没有任务进入休眠,当前线程是最后一个活动线程的时候,就调用业务接口,获取需要处理的任务,放入任务池中,
  4. 同时唤醒其它休眠线程开始工作。
  5. 3、在NotSleep的工作模式:当一个线程任务处理完毕,从任务池中取不到任务的时候,立即调用业务接口获取需要处理的任务,放入任务池中。
  6. 4Sleep模式在实现逻辑上相对简单清晰,但存在一个大任务处理时间长,导致其它线程不工作的情况。
  7. 5、在NotSleep模式下,减少了线程休眠的时间,避免大任务阻塞的情况,但为了避免数据被重复处理,增加了CPU在数据比较上的开销。
  8. 同时要求业务接口实现对象的比较接口。
  9. 6、如果对任务处理不允许停顿的情况下建议用NotSleep模式,其它情况建议用sleep模式。

tbschedule的更多相关文章

  1. 详解应对平台高并发的分布式调度框架TBSchedule

    转载: 详解应对平台高并发的分布式调度框架TBSchedule

  2. 关于TbSchedule任务调度管理框架的整合部署

    一.前言 任务调度管理作为基础架构通常会出现于我们的业务系统中,目的是让各种任务能够按计划有序执行.比如定时给用户发送邮件.将数据表中的数据同步到另一个数据表都是一个任务,这些相对耗时的操作通过任务调 ...

  3. 分布式定时任务框架比较,spring batch, tbschedule jobserver

    分布式定时任务框架比较,spring batch, tbschedule jobserver | 移动开发参考书 分布式定时任务框架比较,spring batch, tbschedule jobser ...

  4. 淘宝开源任务调度框架tbschedule

    背景 分布式任务调度是非常常见的一种应用场景,一般对可用性和性能要求不高的任务,采用单点即可,例如linux的crontab,spring的quarz,但是如果要求部署多个节点,达到高可用的效果,上面 ...

  5. 深入理解分布式调度框架TBSchedule及源码分析

    简介 由于最近工作比较忙,前前后后花了两个月的时间把TBSchedule的源码翻了个底朝天.关于TBSchedule的使用,网上也有很多参考资料,这里不做过多的阐述.本文着重介绍TBSchedule的 ...

  6. TBschedule入门

    tbschedule 淘宝的wiki: http://code.taobao.org/p/tbschedule/wiki/index/ 截取内容如下: 此文档内部包括: 1.设计目标说明 2.主要概念 ...

  7. TBSchedule源码阅读2-TBScheduleManagerFactory 定时任务ManagerFactoryTimerTask

    定时任务 : 主要功能:监听zookeeper状态,正常则this.factory.refresh(),异常则this.factory.reStart(); 1 正常情况this.factory.re ...

  8. TBSchedule源码阅读1-TBScheduleManagerFactory

    TBSchedule 1 TBScheduleManagerFactory 初始化    成员变量    ZKManager;    IScheduleDataManager;    Schedule ...

  9. 分布式开源调度框架TBSchedule原理与应用

    主要内容: 第一部分 TBSchedule基本概念及原理 1. 概念介绍 2. 工作原理 3. 源代码分析 4. 与其它开源调度框架对照 第二部分 TBSchedule分布式调度演示样例 1. TBS ...

随机推荐

  1. CentOS 6.5 + Nginx 1.8.0 + PHP 5.6(with PHP-FPM) 负载均衡源码安装 之 (三)Nginx负载均衡配置

    Nginx反向代理到单个PHP-FPM(PHP-FPM可位于不同机器) 0.首先,创建我们的网站根目录[注:须在PHP-FPM所在的那台机器创建](以后网站的代码放到此目录下): mkdir /opt ...

  2. Owncloud中文目錄包裹下載

    Owncloud提供私有雲端儲存環境的自由軟體解決方案,目前4.5版中文支援已經很完整,但是早期ZIP壓縮檔內的檔名不支援utf-8,所以使用ZIP格式下載整個目錄或多個檔案時大部分解縮軟體無法正確處 ...

  3. VC++中调用cmd的集中方式

    1. system方法: 原型: int __cdecl system(const char *); 例如: system("ipconfig"); 2. WinExec方法: 相 ...

  4. 百度贴吧的网络爬虫(v0.4)源码及解析

    更新:感谢评论中朋友的提醒,百度贴吧现在已经改成utf-8编码了吧,需要把代码中的decode('gbk')改成decode('utf-8').   百度贴吧的爬虫制作和糗百的爬虫制作原理基本相同,都 ...

  5. 动态共享库(so)开发精悍教程

    动态共享库(so)开发精悍教程 翻译并根据实际情况进行了小小修改,仅关注Linux下动态共享库(Dynamic shared library .so)的开发. 1 简单的so实例 源文件 //test ...

  6. USENIX 最佳论文奖:擦除 Windows Azure 存储编码

     我们发表了一篇介绍Windows Azure 存储如何用编码方式擦除数据的论文,此论文在 2012 年 6 月的 USENIX 技术年会上荣获最佳论文奖.这是 MicrosoftResearch ...

  7. 【转】Beagleboard:BeagleBoneBlack

    原文网址:http://elinux.org/Beagleboard:BeagleBoneBlack Did you know that elinux.org has Mailing Lists? P ...

  8. Contest - 第10届“新秀杯”ACM程序设计大赛网络资格赛 赛后信息(晋级名单·正式版)

    2014_acm_fresh_0057 刘畅 20131620 2014_acm_fresh_0099 汪哲 20132185 2014_acm_fresh_0086 陈顺 2014111776 20 ...

  9. J2EE基础总结(4)——JSP

    什么是JSP       JSP全名为Java Server Pages,中文名叫javaserver页面,其根本是一个简化的Servlet设计,它是由Sun  Microsystems公司倡导.很多 ...

  10. Android经常使用的五种弹出对话框

    一个Android开发中经常使用对话框的小样例,共同拥有五种对话框:普通弹出对话框,单选对话框,多选对话框,输入对话框及进度条样式对话框: <LinearLayout xmlns:android ...