Console下載:trunk/console/ScheduleConsole.war
技術(shù)支持:忌少 jishao@taobao.com
推薦項目:QLExpress 簡介高效的腳本引擎
pom引用:
com.taobao.pamirs.schedule
tbschedule
3.2.6
此文檔內(nèi)部包括:
1、設(shè)計目標(biāo)說明
2、主要概念解釋
3、涉及的數(shù)據(jù)對象說明
4、涉及的業(yè)務(wù)接口說明
5、Sleep模式和NotSleep模式的區(qū)別
6、使用過程中的注意事項
1、tbschedule的目的是讓一種批量任務(wù)或者不斷變化的任務(wù),能夠被動態(tài)的分配到多個主機(jī)的JVM中,不同的線程組中并行執(zhí)行。所有的任務(wù)能夠被不重復(fù),不遺漏的快速處理。
2、調(diào)度的Manager可以動態(tài)的隨意增加和停止
3、可以通過JMX控制調(diào)度服務(wù)的創(chuàng)建和停止
4、可以指定調(diào)度的時間區(qū)間:
PERMIT_RUN_START_TIME :允許執(zhí)行時段的開始時間crontab的時間格式.以startrun:開始,則表示開機(jī)立即啟動調(diào)度
PERMIT_RUN_END_TIME :允許執(zhí)行時段的結(jié)束時間crontab的時間格式,如果不設(shè)置,表示取不到數(shù)據(jù)就停止
PERMIT_RUN_START_TIME ='0 * * * * ?' 表示在每分鐘的0秒開始
PERMIT_RUN_START_TIME ='20 * * * * ?' 表示在每分鐘的20秒終止
就是每分鐘的0-20秒執(zhí)行,其它時間休眠
格式信息請參照:http://dogstar.javaeye.com/blog/116130
TaskType任務(wù)類型:
是任務(wù)調(diào)度分配處理的單位,例如:
1、將一張表中的所有狀態(tài)為STS=’N’的所有數(shù)據(jù)提取出來發(fā)送給其它系統(tǒng),同時將修改狀態(tài)STS=’Y’,就是一種任務(wù)。TaskType=’DataDeal’
2、將一個目錄以所有子目錄下的所有文件讀取出來入庫,同時把文件移到對應(yīng)的備份目錄中,也是一種任務(wù)。TaskType=’FileDeal’。
3、可以為一個任務(wù)類型自定義一個字符串參數(shù)由應(yīng)用自己解析。例如:"AREA=杭州,YEAR>30"
ScheduleServer任務(wù)處理器
1、是由一組線程【1..n個線程】構(gòu)成的任務(wù)處理單元,每一任務(wù)處理器有一個唯一的全局標(biāo)識,
一般以IP$UUID[例如192.168.1.100$0C78F0C0FA084E54B6665F4D00FA73DC]的形式出現(xiàn)。 一個任務(wù)類型的數(shù)據(jù)可以由1..n個任務(wù)處理器同時進(jìn)行。
2、這些任務(wù)處理器可以在同一個JVM中,也可以分布在不同主機(jī)的JVM中。任務(wù)處理器內(nèi)部有一個心跳線程,用于確定Server的狀態(tài)和任務(wù)的動態(tài)分配,
有一組工作線程,負(fù)責(zé)處理查詢?nèi)蝿?wù)和具體的任務(wù)處理工作。
3、目前版本所有的心跳信息都是存放在Zookeeper服務(wù)器中的,所有的Server都是對等的,當(dāng)一個Server死亡后,其它Server會接管起擁有的任務(wù)隊列,
期間會有幾個心跳周期的時延。后續(xù)可以用類似ConfigerServer類的存儲。
4、現(xiàn)有的工作線程模式分為Sleep模式和NotSleep模式。缺省是缺省是NOTSLEEP模式。在通常模式下,在通常情況下用Sleep模式。
在一些特殊情況需要用NotSleep模式。兩者之間的差異在后續(xù)進(jìn)行描述。
TaskItem任務(wù)項
是對任務(wù)進(jìn)行的分片劃分。例如:
1、將一個數(shù)據(jù)表中所有數(shù)據(jù)的ID按10取模,就將數(shù)據(jù)劃分成了0、1、2、3、4、5、6、7、8、9供10個任務(wù)項。
2、將一個目錄下的所有文件按文件名稱的首字母(不區(qū)分大小寫),
就劃分成了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、將一個數(shù)據(jù)表的數(shù)據(jù)ID哈希后按1000取模作為最后的HASHCODE,我們就可以將數(shù)據(jù)按[0,100)、[100,200) 、[200,300)、[300,400) 、
[400,500)、[500,600)、[600,700)、[700,800)、[800,900)、 [900,1000)劃分為十個任務(wù)項,當(dāng)然你也可以劃分為100個任務(wù)項,最多是1000個任務(wù)項。
任務(wù)項是進(jìn)行任務(wù)分配的最小單位。一個任務(wù)項只能由一個ScheduleServer來進(jìn)行處理。但一個Server可以處理任意數(shù)量的任務(wù)項。
例如任務(wù)被劃分為了10個隊列,可以只啟動一個Server,所有的任務(wù)項都有這一個Server來處理;也可以啟動兩個Server,每個Sever處理5個任務(wù)項;
但最多只能啟動10個Server,每一個ScheduleServer只處理一個任務(wù)項。如果在多,則第11個及之后的Server將不起作用,處于休眠狀態(tài)。
4、可以為一個任務(wù)項自定義一個字符串參數(shù)由應(yīng)用自己解析。例如:"TYPE=A,KIND=1"
TaskDealBean任務(wù)處理類
是業(yè)務(wù)系統(tǒng)進(jìn)行數(shù)據(jù)處理的實現(xiàn)類。要求實現(xiàn)Schedule的接口IScheduleTaskDealMulti或者IScheduleTaskDealSingle。
接口主要包括兩個方法。一個是根據(jù)調(diào)度器分配到的隊列查詢數(shù)據(jù)的接口,一個是進(jìn)行數(shù)據(jù)處理的接口。
運行時間
1、可以指定任務(wù)處理的時間間隔,例如每天的1:00-3:00執(zhí)行,或者每個月的第一天執(zhí)行、每一個小時的第一分鐘執(zhí)行等等。
間格式與crontab相同。如果不指定就表示一致運行。PERMIT_RUN_START_TIME,PERMIT_RUN_END_TIME
2、可以指定如果沒有數(shù)據(jù)了,休眠的時間間隔。SLEEP_TIME_NODATA 單位秒
3、可以指定每處理完一批數(shù)據(jù)后休眠的時間間隔.SLEEP_TIME_INTERVAL 單位
OwnSign環(huán)境區(qū)域
是對運行環(huán)境的劃分,進(jìn)行調(diào)度任務(wù)和數(shù)據(jù)隔離。例如:開發(fā)環(huán)境、測試環(huán)境、預(yù)發(fā)環(huán)境、生產(chǎn)環(huán)境。
不同的開發(fā)人員需要進(jìn)行數(shù)據(jù)隔離也可以用OwnSign來實現(xiàn),避免不同人員的數(shù)據(jù)沖突。缺省配置的環(huán)境區(qū)域OwnSign='BASE'。
例如:TaskType='DataDeal',配置的隊列是0、1、2、3、4、5、6、7、8、9。缺省的OwnSign='BASE'。
此時如果再啟動一個測試環(huán)境,則Schedule會動態(tài)生成一個TaskType='DataDeal-Test'的任務(wù)類型,環(huán)境會作為一個變量傳遞給業(yè)務(wù)接口,
由業(yè)務(wù)接口的實現(xiàn)類,在讀取數(shù)據(jù)和處理數(shù)據(jù)的時候進(jìn)行確定。業(yè)務(wù)系統(tǒng)一種典型的做法就是在數(shù)據(jù)表中增加一個OWN_SIGN字段。
在創(chuàng)建數(shù)據(jù)的時候根據(jù)運行環(huán)境填入對應(yīng)的環(huán)境名稱,在Schedule中就可以環(huán)境的區(qū)分了。
調(diào)度策略
是指某一個任務(wù)在調(diào)度集群上的分布策略,可以制定:
1、可以指定任務(wù)的機(jī)器IP列表。127.0.0.1和localhost表示所有機(jī)器上都可以執(zhí)行
2、可以指定每個機(jī)器上能啟動的線程組數(shù)量,0表示沒有限制
3、可以指定所有機(jī)器上運行的線程組總數(shù)。
包含三個業(yè)務(wù)接口,:
1、IScheduleTaskDeal 調(diào)度器對外的基礎(chǔ)接口,是一個基類,并不能被直接使用
2、IScheduleTaskDealSingle 單任務(wù)處理的接口,繼承 IScheduleTaskDeal
3、IScheduleTaskDealMulti 可批處理的任務(wù)接口,繼承 IScheduleTaskDeal
IScheduleTaskDeal 調(diào)度器對外的基礎(chǔ)接口
public interface IScheduleTaskDeal {
/**
* 根據(jù)條件,查詢當(dāng)前調(diào)度服務(wù)器可處理的任務(wù)
* @param taskParameter 任務(wù)的自定義參數(shù)
* @param ownSign 當(dāng)前環(huán)境名稱
* @param taskQueueNum 當(dāng)前任務(wù)類型的任務(wù)隊列數(shù)量
* @param taskQueueList 當(dāng)前調(diào)度服務(wù)器,分配到的可處理隊列
* @param eachFetchDataNum 每次獲取數(shù)據(jù)的數(shù)量
* @return
* @throws Exception
*/
public List selectTasks(String taskParameter,String ownSign,int taskQueueNum,List taskItemList,int eachFetchDataNum) throws Exception;
/**
* 獲取任務(wù)的比較器,只有在NotSleep模式下需要用到
* @return
*/
public Comparator getComparator();
}
IScheduleTaskDealSingle 單任務(wù)處理的接口
public interface IScheduleTaskDealSingle extends IScheduleTaskDeal {
/**
* 執(zhí)行單個任務(wù)
* @param task Object
* @param ownSign 當(dāng)前環(huán)境名稱
* @throws Exception
*/
public boolean execute(T task,String ownSign) throws Exception;
}
IScheduleTaskDealMulti 可批處理的任務(wù)接口
public interface IScheduleTaskDealMulti? extends IScheduleTaskDeal {
/**
* 執(zhí)行給定的任務(wù)數(shù)組。因為泛型不支持new 數(shù)組,只能傳遞OBJECT[]
* @param tasks 任務(wù)數(shù)組
* @param ownSign 當(dāng)前環(huán)境名稱
* @return
* @throws Exception
*/
public boolean execute(Object[] tasks,String ownSign) throws Exception;
}
1、ScheduleServer啟動的工作線程組線程是共享一個任務(wù)池的。
2、在Sleep的工作模式:當(dāng)某一個線程任務(wù)處理完畢,從任務(wù)池中取不到任務(wù)的時候,檢查其它線程是否處于活動狀態(tài)。如果是,則自己休眠;
如果其它線程都已經(jīng)因為沒有任務(wù)進(jìn)入休眠,當(dāng)前線程是最后一個活動線程的時候,就調(diào)用業(yè)務(wù)接口,獲取需要處理的任務(wù),放入任務(wù)池中,
同時喚醒其它休眠線程開始工作。
3、在NotSleep的工作模式:當(dāng)一個線程任務(wù)處理完畢,從任務(wù)池中取不到任務(wù)的時候,立即調(diào)用業(yè)務(wù)接口獲取需要處理的任務(wù),放入任務(wù)池中。
4、Sleep模式在實現(xiàn)邏輯上相對簡單清晰,但存在一個大任務(wù)處理時間長,導(dǎo)致其它線程不工作的情況。
5、在NotSleep模式下,減少了線程休眠的時間,避免大任務(wù)阻塞的情況,但為了避免數(shù)據(jù)被重復(fù)處理,增加了CPU在數(shù)據(jù)比較上的開銷。
同時要求業(yè)務(wù)接口實現(xiàn)對象的比較接口。
6、如果對任務(wù)處理不允許停頓的情況下建議用NotSleep模式,其它情況建議用sleep模式。
其他可以參考的內(nèi)容
我:
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.表達(dá)式意義
秒 分 時 ?日 月 星 年
11."0 0 12 * * ?" 每天中午12點觸發(fā)
12."0 15 10 ? * *" 每天上午10:15觸發(fā)
13."0 15 10 * * ?" 每天上午10:15觸發(fā)
14."0 15 10 * * ? *" 每天上午10:15觸發(fā)
15."0 15 10 * * ? 2005" 2005年的每天上午10:15觸發(fā)
16."0 * 14 * * ?" 在每天下午2點到下午2:59期間的每1分鐘觸發(fā)
17."0 0/5 14 * * ?" 在每天下午2點到下午2:55期間的每5分鐘觸發(fā)
18."0 0/5 14,18 * * ?" 在每天下午2點到2:55期間和下午6點到6:55期間的每5分鐘觸發(fā)
19."0 0-5 14 * * ?" 在每天下午2點到下午2:05期間的每1分鐘觸發(fā)
20."0 10,44 14 ? 3 WED" 每年三月的星期三的下午2:10和2:44觸發(fā)
21."0 15 10 ? * MON-FRI" 周一至周五的上午10:15觸發(fā)
22."0 15 10 15 * ?" 每月15日上午10:15觸發(fā)
23."0 15 10 L * ?" 每月最后一日的上午10:15觸發(fā)
24."0 15 10 ? * 6L" 每月的最后一個星期五上午10:15觸發(fā)
25."0 15 10 ? * 6L 2002-2005" 2002年至2005年的每月的最后一個星期五上午10:15觸發(fā)
26."0 15 10 ? * 6#3" 每月的第三個星期五上午10:15觸發(fā)
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 *