考拉定時任務框架kSchedule
此文已由作者楊凱明授權網易雲社群釋出。
歡迎訪問網易雲社群,瞭解更多網易技術產品運營經驗。
1.背景
目前專案中使用的定時任務框架存在下面這些問題
沒有統一的定時任務管理平臺
目前專案中使用定時任務的方式比較混亂,有部分系統使用了cron外掛,有部分系統直接使用的spring task註解配置,沒有一個統一的管理平臺。使用cron外掛的定時任務的配置整合在ms後臺,管理頁面比較簡陋,需要一個更加友好、功能更加完善的管理系統,專門負責定時任務的管理,包括定時任務的建立、修改、刪除、觸發、檢視歷史等
對每個定時任務沒有完善的監控
目前專案中沒有對定時任務的監控,無法知道定時任務的執行情況和執行時間;當定時任務沒有觸發時沒有告警;沒法檢視定時任務的執行歷史情況
單點問題
目前使用spring task或quartz來做定時任務的系統,都需要手動指定執行定時任務的機器,這樣會導致某臺機器負載很高,並且如果這臺機器宕機了則定時任務都不會執行
重複執行問題
有些定時任務本身不是冪等的,如果重複執行的話會有很多問題,比如簡訊的定時傳送等;目前cron出現過zk斷開後,導致定時任務被重複執行的情況
針對這些問題,需要設計一種能解決上述問題的新框架
2.設計
設計目標:
定時任務統一配置、統一管理
支援動態修改任務狀態,動態暫停/恢復任務,即時生效
減少使用方的限制依賴
定時任務不遺漏、不重複的被執行
支援任務分片併發執行
完善的監控、統計功能
整個框架分為四部分:
排程伺服器管理平臺:負責定時任務的配置和管理,並定時進行任務的分配;獲取每次任務執行的結果進行統計
任務執行器:通過心跳更新伺服器資訊;獲取配置的任務資訊定時執行任務,並根據任務執行情況上報執行結果
zk叢集:儲存任務配置資訊和伺服器節點資訊;提供分散式協調服務
資料庫:記錄任務的每次執行情況,用於監控和統計
架構部署圖如下:
ZK節點圖:
觸發型別:
定時觸發:通過定時任務框架與cron表示式定時觸發
手動觸發:通過kschedule平臺觸發(1.按分配資訊觸發;2.指定一臺機器執行)
啟動觸發:應用啟動時觸發(如載入初始化本地快取)
RPC觸發:通過dubbo介面觸發
任務型別:
都不執行(只需人為去觸發,使用場景較少)
所有的機器上只有一臺執行:該產品下所有註冊上來的機器只會選擇一臺來執行
所有機器都執行:該產品下所有註冊上來的機器都會執行該任務
在指定的機器上全部執行:被選擇的機器都會執行該任務
指定的機器上只有一臺執行:被選擇的機器中只會有一臺會執行該任務
任務分片執行(下面解釋)
不重複執行策略及異常整理
任務狀態變為DOING狀態後,備用機器不再監聽任務,認為任務已經有機器執行,如執行的機器在任務執行時掛掉,則造成任務遺漏執行。
如主機器500ms內沒有將任務變為DOING狀態,則備用機器恢復搶鎖進行任務執行,沒搶到鎖的機器繼續監聽任務狀態。
kschedule服務端掛了:不影響任務執行
執行前伺服器網路斷開:由備機執行
執行前伺服器掛掉:由備機執行
執行中伺服器網路斷開:任務正常執行,可能會報警遺漏執行
執行中伺服器掛掉:任務不能正常執行,會報警
zk掛掉:任務不能正常(zk程序監控)
執行分配的機器全掛掉:任務不能正常執行,會報警
不遺漏執行策略及異常整理
任務狀態變為DOING狀態後,備用機器繼續監聽任務,直到任務狀態變更為DONE時,監聽取消。
如主機器在DOING狀態後掛掉或者失去與ZK的連線,則備用機器恢復搶鎖進行任務執行,沒搶到鎖的機器繼續監聽任務狀態,可能會造成任務重複執行。
kschedule服務端掛了:不影響任務執行
執行前伺服器網路斷開:由備機執行
執行前伺服器掛掉:由備機執行
執行中伺服器網路斷開:由備機執行,可能重複執行
執行中伺服器掛掉:由備機執行
執行中任務執行超時:由備機執行,可能重複執行
zk掛掉:任務不能正常( zk程序監控)
執行分配的機器全掛掉:任務不能正常執行,會報警
分片任務:
分片任務即將一個任務按一定規則拆成多個子任務在多臺機器上的多個執行緒中並行執行。
需要實現IScheduleShardingTask介面,
例子1:伺服器有5臺
分片資訊:0,1,2,3,4,5,6,7,8,9
分片最大執行緒數:10
分片獲取資料的數量:100
則kschedule會將任務進行分片,每臺機器分配到2個執行執行緒,每個執行緒執行1個分片,每個分片拉取100條資料。
每個執行緒回撥到selectItems方法上的引數為selectItems(null,10,[0],100);
selectItems:應用系統在介面實現中根據分片傳入的引數去DB拉取待處理的資料。
execute:應用系統在介面實現中根據selectItems方法拉取的資料進行資料處理。
例子2: 伺服器有5臺
分片資訊: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
分片最大執行緒數:10
分片獲取資料的數量:1000
則kschedule會將任務進行分片,每臺機器分配到2個執行執行緒,每個執行緒執行3個分片(部分是2個分片),每個分片拉取1000條資料。
每個執行緒回撥到selectItems方法上的引數為selectItems(null,26,[a,b,c],1000);
selectItems:應用系統在介面實現中根據分片傳入的引數去DB拉取待處理的資料。
execute:應用系統在介面實現中根據selectItems方法拉取的資料進行資料處理。
/**
- 分片任務定義介面,業務方需實現該接口才能使用分片功能
- @author hzyangkaiming
*
/public interface IScheduleShardingTask { / *
* 拉取業務資料的方法 * @param parameter 自定義引數 * @param shardingCount 任務分片總數 * @param shardingIndexs 分配到的任務分片 * @param limit 每次獲取資料的數量 * @return 待處理的資料 * @author yangkaiming * @since 2016年5月16日 */ public List selectItems(String parameter,int shardingCount,List shardingIndexs,int limit);/** * 執行指定的任務 * * @param items 處理的資料 * @return 成功/失敗 * @author yangkaiming * @since 2016年5月16日 */ public boolean execute(T[] items);
執行日誌:
執行日誌會在框架排程業務方法時進行記錄,寫到ZK,kschedule平臺會收集並清理zk。
使用者可以在kschedule平臺查詢任務執行情況,包括執行時間情況,任務每次觸發執行的伺服器等資訊
3.監控
1.根據cron表示式及任務執行日誌,對任務漏執行、重複執行、超時執行等進行準實時報警。
2.任務執行失敗(業務方法未捕獲的Exeption)報警,並推送錯誤堆疊,幫助定位解決問題。
2.支援非常規節假日簡訊報警,平日上班時間popo、stone報警,下班時間popo、stone、簡訊報警。
4.實踐
經過一年的推廣及優化,考拉目前各系統定時任務已經基本完成切換,並穩定運行於kschedule平臺,當然也有不少坑:
坑1:業務方法卡住
背景:定時任務執行時會佔有該任務的分散式鎖,如果任務掛住會造成後面每次觸發任務都會忽略執行,防止重複執行。
問題: http,ftp等外部呼叫相關業務定時任務出現任務掛住的問題
實時處理:任務出現超時並長期執行中,則優先列印堆疊資訊,保留現場,並根據業務方評估是否人工去zk釋放鎖,讓任務先跑起來。
後期處理:業務放根據堆疊等資訊定位卡主原因進行優化(主要以超時時間為主),平臺增加實時zk鎖查詢,判斷任務是否佔用鎖,並增加管理員刪鎖按鈕,提升運維能力。
坑2:新上線分片任務重複執行並執行紊亂
背景:分片任務會根據分配資訊非同步起執行緒(有預設執行緒池)進行處理,並且單個分片沒有加分片的分散式鎖。業務放上線10個分片任務,每個分片任務10個執行緒,總共4臺機器,觸發時間都是每分鐘的0秒,預設執行緒池5個初始執行緒,1000的佇列,佇列滿擴到20個執行緒
問題:業務系統上線,業務系統ftp呼叫超時問題也比較多,造成分片任務執行完全紊亂,執行日誌無參考性,業務方法出現重複執行
實時處理:經過初步判斷,根據業務方分片任務數量及執行緒量,優先加大執行緒池提高處理能力,緊急上線,但不能完全解決問題。
後期處理:修改預設執行緒池策略,去掉緩衝佇列,執行緒不夠直接擴,最大200個,超過150個報警;因為業務方需要高頻率排程這些分片任務,加上與ftp呼叫等執行時間不可控因素,因此增加單個分片的分散式鎖,防止重複執行,並且極大降低執行緒佔用量。
那麼現在:
kschedule平臺目前每日的任務執行次數平均在20+w次。
網易金融也已搭建自己的kschedule環境,並在線上使用中。
考拉訂單流推送、申報單推送、物流資訊等供應鏈相關業務已接入分片任務,極大提高了業務吞吐量、降低DB壓力,提升了通關效率。
支撐雙十一、黑五、雙十二等大促,高峰期統一暫停非關鍵定時任務,讓出系統資源,提高業務系統穩定性。
5.計劃
近:任務執行時間TOP統計,方便業務系統優化定時任務效能等;
遠:可以根據考拉的業務需要,增加非java方法排程功能等;
歡迎考拉的兄弟姐妹貢獻需求及改進點
網易雲免費體驗館,0成本體驗20+款雲產品!
更多網易技術、產品、運營經驗分享請點選。
文章來源: ofollow,noindex" target="_blank">網易雲社群