tbschedule

Console Demo地址: www.tbschedule.com

Console下載: trunk/console/ScheduleConsole.war

技術支持: 忌少 [email protected]

推薦項目: QLExpress 簡介高效的腳本引擎

pom引用:
<groupId>com.taobao.pamirs.schedule</groupId>
<artifactId>tbschedule</artifactId>
<version>3.2.6</version>

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<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模式。
5、使用過程中的注意事項(待續)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章