Console下載:trunk/console/ScheduleConsole.war
技術(shù)支持:忌少 jishao@taobao.com
推薦項目:QLExpress 簡介高效的腳本引擎
pom引用:
com.taobao.pamirs.schedule
tbschedule
3.2.6
此文檔內(nèi)部包括:
1锨天、設(shè)計目標說明
2合冀、主要概念解釋
3、涉及的數(shù)據(jù)對象說明
4驼壶、涉及的業(yè)務(wù)接口說明
5琅捏、Sleep模式和NotSleep模式的區(qū)別
6逢渔、使用過程中的注意事項
1飞蹂、tbschedule的目的是讓一種批量任務(wù)或者不斷變化的任務(wù)几苍,能夠被動態(tài)的分配到多個主機的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:開始,則表示開機立即啟動調(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ù)處理器有一個唯一的全局標識茉兰,
一般以IP$UUID[例如192.168.1.100$0C78F0C0FA084E54B6665F4D00FA73DC]的形式出現(xiàn)。 一個任務(wù)類型的數(shù)據(jù)可以由1..n個任務(wù)處理器同時進行欣簇。
2规脸、這些任務(wù)處理器可以在同一個JVM中,也可以分布在不同主機的JVM中熊咽。任務(wù)處理器內(nèi)部有一個心跳線程莫鸭,用于確定Server的狀態(tài)和任務(wù)的動態(tài)分配,
有一組工作線程横殴,負責(zé)處理查詢?nèi)蝿?wù)和具體的任務(wù)處理工作被因。
3、目前版本所有的心跳信息都是存放在Zookeeper服務(wù)器中的衫仑,所有的Server都是對等的梨与,當一個Server死亡后,其它Server會接管起擁有的任務(wù)隊列文狱,
期間會有幾個心跳周期的時延粥鞋。后續(xù)可以用類似ConfigerServer類的存儲。
4瞄崇、現(xiàn)有的工作線程模式分為Sleep模式和NotSleep模式呻粹。缺省是缺省是NOTSLEEP模式到踏。在通常模式下,在通常情況下用Sleep模式尚猿。
在一些特殊情況需要用NotSleep模式窝稿。兩者之間的差異在后續(xù)進行描述。
TaskItem任務(wù)項
是對任務(wù)進行的分片劃分凿掂。例如:
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ù)項犀呼,當然你也可以劃分為100個任務(wù)項洲押,最多是1000個任務(wù)項。
任務(wù)項是進行任務(wù)分配的最小單位圆凰。一個任務(wù)項只能由一個ScheduleServer來進行處理杈帐。但一個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)進行數(shù)據(jù)處理的實現(xiàn)類娇掏。要求實現(xiàn)Schedule的接口IScheduleTaskDealMulti或者IScheduleTaskDealSingle呕寝。
接口主要包括兩個方法。一個是根據(jù)調(diào)度器分配到的隊列查詢數(shù)據(jù)的接口婴梧,一個是進行數(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)境的劃分崭歧,進行調(diào)度任務(wù)和數(shù)據(jù)隔離隅很。例如:開發(fā)環(huán)境、測試環(huán)境率碾、預(yù)發(fā)環(huán)境叔营、生產(chǎn)環(huán)境。
不同的開發(fā)人員需要進行數(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ù)的時候進行確定呵燕。業(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ù)的機器IP列表泛范。127.0.0.1和localhost表示所有機器上都可以執(zhí)行
2让虐、可以指定每個機器上能啟動的線程組數(shù)量,0表示沒有限制
3罢荡、可以指定所有機器上運行的線程組總數(shù)赡突。
包含三個業(yè)務(wù)接口区赵,:
1惭缰、IScheduleTaskDeal 調(diào)度器對外的基礎(chǔ)接口,是一個基類笼才,并不能被直接使用
2漱受、IScheduleTaskDealSingle 單任務(wù)處理的接口,繼承 IScheduleTaskDeal
3、IScheduleTaskDealMulti 可批處理的任務(wù)接口,繼承 IScheduleTaskDeal
IScheduleTaskDeal 調(diào)度器對外的基礎(chǔ)接口
public interface IScheduleTaskDeal {
/**
* 根據(jù)條件骡送,查詢當前調(diào)度服務(wù)器可處理的任務(wù)
* @param taskParameter 任務(wù)的自定義參數(shù)
* @param ownSign 當前環(huán)境名稱
* @param taskQueueNum 當前任務(wù)類型的任務(wù)隊列數(shù)量
* @param taskQueueList 當前調(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 當前環(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 當前環(huán)境名稱
* @return
* @throws Exception
*/
public boolean execute(Object[] tasks,String ownSign) throws Exception;
}
1、ScheduleServer啟動的工作線程組線程是共享一個任務(wù)池的派敷。
2蛹批、在Sleep的工作模式:當某一個線程任務(wù)處理完畢,從任務(wù)池中取不到任務(wù)的時候篮愉,檢查其它線程是否處于活動狀態(tài)般眉。如果是,則自己休眠潜支;
如果其它線程都已經(jīng)因為沒有任務(wù)進入休眠甸赃,當前線程是最后一個活動線程的時候,就調(diào)用業(yè)務(wù)接口冗酿,獲取需要處理的任務(wù)埠对,放入任務(wù)池中,
同時喚醒其它休眠線程開始工作裁替。
3项玛、在NotSleep的工作模式:當一個線程任務(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.表達式意義
秒 分 時 ?日 月 星 年
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 *