tbschedule

淘宝的wiki: http://code.taobao.org/p/tbschedule/wiki/index/

截取内容如下:



此文档内部包括:

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<T> {
/**
 * 根据条件,查询当前调度服务器可处理的任务
 * @param taskParameter 任务的自定义参数
 * @param ownSign 当前环境名称
 * @param taskQueueNum 当前任务类型的任务队列数量
 * @param taskQueueList 当前调度服务器,分配到的可处理队列
 * @param eachFetchDataNum 每次获取数据的数量
 * @return
 * @throws Exception
 */
public List<T> selectTasks(String taskParameter,String ownSign,int taskQueueNum,List<TaskItemDefine> taskItemList,int eachFetchDataNum) throws Exception;

/**
 * 获取任务的比较器,只有在NotSleep模式下需要用到
 * @return
 */
public Comparator<T> getComparator();
}

IScheduleTaskDealSingle 单任务处理的接口

public interface IScheduleTaskDealSingle<T> extends IScheduleTaskDeal<T> {
  /**
   * 执行单个任务
   * @param task Object
   * @param ownSign 当前环境名称
   * @throws Exception
   */
  public boolean execute(T task,String ownSign) throws Exception;

}

IScheduleTaskDealMulti 可批处理的任务接口

public interface IScheduleTaskDealMulti<T>  extends IScheduleTaskDeal<T> {

/**
 * 	执行给定的任务数组。因为泛型不支持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模式。

TBschedule入门的更多相关文章

  1. Angular2入门系列教程7-HTTP(一)-使用Angular2自带的http进行网络请求

    上一篇:Angular2入门系列教程6-路由(二)-使用多层级路由并在在路由中传递复杂参数 感觉这篇不是很好写,因为涉及到网络请求,如果采用真实的网络请求,这个例子大家拿到手估计还要自己写一个web ...

  2. ABP入门系列(1)——学习Abp框架之实操演练

    作为.Net工地搬砖长工一名,一直致力于挖坑(Bug)填坑(Debug),但技术却不见长进.也曾热情于新技术的学习,憧憬过成为技术大拿.从前端到后端,从bootstrap到javascript,从py ...

  3. Oracle分析函数入门

    一.Oracle分析函数入门 分析函数是什么?分析函数是Oracle专门用于解决复杂报表统计需求的功能强大的函数,它可以在数据中进行分组然后计算基于组的某种统计值,并且每一组的每一行都可以返回一个统计 ...

  4. Angular2入门系列教程6-路由(二)-使用多层级路由并在在路由中传递复杂参数

    上一篇:Angular2入门系列教程5-路由(一)-使用简单的路由并在在路由中传递参数 之前介绍了简单的路由以及传参,这篇文章我们将要学习复杂一些的路由以及传递其他附加参数.一个好的路由系统可以使我们 ...

  5. Angular2入门系列教程5-路由(一)-使用简单的路由并在在路由中传递参数

    上一篇:Angular2入门系列教程-服务 上一篇文章我们将Angular2的数据服务分离出来,学习了Angular2的依赖注入,这篇文章我们将要学习Angualr2的路由 为了编写样式方便,我们这篇 ...

  6. Angular2入门系列教程4-服务

    上一篇文章 Angular2入门系列教程-多个组件,主从关系 在编程中,我们通常会将数据提供单独分离出来,以免在编写程序的过程中反复复制粘贴数据请求的代码 Angular2中提供了依赖注入的概念,使得 ...

  7. wepack+sass+vue 入门教程(三)

    十一.安装sass文件转换为css需要的相关依赖包 npm install --save-dev sass-loader style-loader css-loader loader的作用是辅助web ...

  8. wepack+sass+vue 入门教程(二)

    六.新建webpack配置文件 webpack.config.js 文件整体框架内容如下,后续会详细说明每个配置项的配置 webpack.config.js直接放在项目demo目录下 module.e ...

  9. wepack+sass+vue 入门教程(一)

    一.安装node.js node.js是基础,必须先安装.而且最新版的node.js,已经集成了npm. 下载地址 node安装,一路按默认即可. 二.全局安装webpack npm install ...

随机推荐

  1. 【USACO】干草金字塔

    题目描述 贝西要用干草包堆出一座金字塔.干草包会从传送带上陆续运来,依次出现 N 包,每包干草可 以看做是一个二维平面上的一个长方形,第 i 包干草的宽度是 W i ,长度统一为 1. 金字塔的修建有 ...

  2. 【luogu P4007 清华集训2017】小Y和恐怖奴隶主

    题目背景 “A fight? Count me in!” 要打架了,算我一个. “Everyone, get in here!” 所有人,都过来! 题目描述 小 Y 是一个喜欢玩游戏的 OIer.一天 ...

  3. hdu 5266 pog loves szh III(lca + 线段树)

    I - pog loves szh III Time Limit:6000MS     Memory Limit:131072KB     64bit IO Format:%I64d & %I ...

  4. solr6.6初探之配置篇

    一.solr的简介 1) solr是企业级应用的全文检索项目,它是基于Apache Lucence搜索引擎开发出来的用于搜索的应用工程 2) solr最新版本6.6 下载地址:下载地址 二 启动与配置 ...

  5. Map value类型不同的写法

    Map value类型不同的写法 Map<String, Object> accountMap=new HashMap<String, Object>(); int userI ...

  6. substr和substring的区别

    substr和substring两个都是截取字符串的. 两者有相同点,如果只是写一个参数,两者的作用都是一样的:就是截取字符串当前下标以后直到字符串最后的字符串片段. 例如:`var a=”abcde ...

  7. Python爬取腾讯新闻首页所有新闻及评论

    前言 这篇博客写的是实现的一个爬取腾讯新闻首页所有的新闻及其所有评论的爬虫.选用Python的Scrapy框架.这篇文章主要讨论使用Chrome浏览器的开发者工具获取新闻及评论的来源地址. Chrom ...

  8. Python小代码_14_交换 2 个变量的 3 种方式

    a = 4 b = 5 #第一种 c = a a = b b = c print(a, b) #输出结果 #5 4 #第二种 a = a + b b = a - b a = a - b print(a ...

  9. Python3 MySQL 数据库连接

    什么是 PyMySQL? PyMySQL 是在 Python3.x 版本中用于连接 MySQL 服务器的一个库,Python2中则使用mysqldb. PyMySQL 遵循 Python 数据库 AP ...

  10. 线程停止与volatile

    1.使用标志位停止线程 在Java中希望停止线程,可以使用设置标志位的方法,如下例所示: class SimpleTask implements Runnable{ private boolean s ...