XXL-JOB內(nèi)部機(jī)制大揭秘,任務(wù)飛起來!
今天我們給大家分享一下XXL-JOB這個框架的內(nèi)部運行機(jī)制,因為大家平時開發(fā)系統(tǒng)的時候肯定會遇到后臺調(diào)度任務(wù)的相關(guān)功能開發(fā)吧,比如說系統(tǒng)需要定時跑個什么任務(wù)做一些數(shù)據(jù)處理的工作,或者是數(shù)據(jù)檢查的工作這類的,這些都是要開后臺調(diào)度任務(wù)的。
那什么是后臺調(diào)度任務(wù)?說白了其實就是你系統(tǒng)啟動后開個線程后臺自己跑,執(zhí)行任務(wù),這就是后臺調(diào)度任務(wù)了,你的線程里可以設(shè)置一個while循環(huán),如果任務(wù)沒結(jié)束就一直在while循環(huán)里重復(fù)執(zhí)行一些代碼,每次執(zhí)行還可以sleep一段時間,那就每次執(zhí)行都有一個時間間隔了,這就是最簡單的調(diào)度任務(wù)。
那自己搞線程有什么問題?問題大了,你線上系統(tǒng)一般都是多機(jī)器部署的吧,那每個機(jī)器上啟動的系統(tǒng)進(jìn)程是不是都有自己的調(diào)度線程?那不同的調(diào)度線程之間怎么協(xié)調(diào)?會不會并發(fā)更新數(shù)據(jù),導(dǎo)致臟數(shù)據(jù)?你是不是還要引入分布式鎖來處理?所以類似這種多臺機(jī)器上同時啟動調(diào)度線程的就是分布式任務(wù)調(diào)度了,為啥叫分布式,因為你多臺機(jī)器一起跑調(diào)度線程啊,可不是分布式嗎?
分布式的意思就是分布在多臺機(jī)器上,大家一定要明白這個點。
而且一般我們開發(fā)的系統(tǒng)都是面向web的系統(tǒng),一般都是web來了請求或者是內(nèi)部其他系統(tǒng)來了rpc調(diào)用,我們系統(tǒng)接口開始跑代碼,系統(tǒng)的運行模型不是那種定時調(diào)度的,所以其實把調(diào)度線程混合在系統(tǒng)里也不好,這個時候就可以當(dāng)當(dāng)當(dāng)當(dāng)了,所以引入一個專門的分布式任務(wù)調(diào)度系統(tǒng),來專門跑各種我們的調(diào)度任務(wù)代碼。
那國內(nèi)這塊用的比較多的開源的分布式任務(wù)調(diào)度系統(tǒng)有比較知名的就是elastic-job,還有就是xxl-job,其實干的事兒都差不多,就是可以把獨立的開源調(diào)度系統(tǒng)部署在多臺機(jī)器上,每臺機(jī)器都可以跑很多調(diào)度任務(wù),我們就把自己的調(diào)度任務(wù)代碼提交給他,然后設(shè)置好調(diào)度策略就可以了,他就會自己按照策略調(diào)度執(zhí)行任務(wù)了。
所以今天分享的重點就是xxl-job這個框架的內(nèi)部工作機(jī)制了!
那我們來進(jìn)入主題了,那在軟件開發(fā)的世界里,定時任務(wù)調(diào)度是不可或缺的一環(huán)。想象一下,系統(tǒng)需要定時備份數(shù)據(jù)、清理日志、發(fā)送提醒郵件,這些工作如果靠人工來完成,那得多低效??!這時候,一個強(qiáng)大的任務(wù)調(diào)度平臺就顯得尤為重要了。而XXL-JOB,作為分布式任務(wù)調(diào)度領(lǐng)域的佼佼者,憑借其輕量級、易擴(kuò)展、高性能的特點,贏得了眾多開發(fā)者的青睞。今天,咱們就來揭開XXL-JOB的神秘面紗,看看它如何讓任務(wù)“飛起來”!
一、XXL-JOB是什么?
首先,咱們得明確一下,XXL-JOB到底是個啥?簡單來說,它就是一個分布式任務(wù)調(diào)度平臺,專門用來管理和調(diào)度定時任務(wù)。這個平臺由調(diào)度中心和執(zhí)行器兩部分組成,調(diào)度中心負(fù)責(zé)任務(wù)的分配和調(diào)度,執(zhí)行器則負(fù)責(zé)具體執(zhí)行這些任務(wù)。通過這樣的設(shè)計,XXL-JOB實現(xiàn)了調(diào)度與任務(wù)的解耦,提高了系統(tǒng)的穩(wěn)定性和擴(kuò)展性。
二、XXL-JOB的核心組件
調(diào)度中心(XXL-JOB-ADMIN)
調(diào)度中心是XXL-JOB的大腦,它負(fù)責(zé)管理所有的調(diào)度信息,包括任務(wù)信息、執(zhí)行器信息等。它就像一個指揮官,根據(jù)任務(wù)的配置信息和執(zhí)行器的注冊信息,制定出合理的調(diào)度計劃,并在適當(dāng)?shù)臅r候?qū)⑷蝿?wù)分配給執(zhí)行器去執(zhí)行。
調(diào)度中心的主要功能包括:
- 任務(wù)管理:新增、修改、刪除任務(wù),設(shè)置任務(wù)的觸發(fā)條件等。
- 執(zhí)行器管理:注冊、注銷執(zhí)行器,監(jiān)控執(zhí)行器的狀態(tài)等。
- 日志管理:查看任務(wù)的執(zhí)行日志,便于問題排查。
調(diào)度中心支持集群部署,通過數(shù)據(jù)庫鎖的方式保證任務(wù)在同一時間只會被一個調(diào)度中心實例觸發(fā)一次,提高了系統(tǒng)的容錯性和可用性。
執(zhí)行器(XXL-JOB-EXECUTOR)
執(zhí)行器是XXL-JOB的手腳,它負(fù)責(zé)接收調(diào)度中心分配的任務(wù),并執(zhí)行具體的任務(wù)邏輯。執(zhí)行器可以部署在多個服務(wù)器上,形成執(zhí)行器集群,從而實現(xiàn)任務(wù)的分布式執(zhí)行。
執(zhí)行器的主要功能包括:
- 任務(wù)執(zhí)行:接收調(diào)度中心的任務(wù)請求,執(zhí)行具體的任務(wù)邏輯。
- 結(jié)果回調(diào):將任務(wù)的執(zhí)行結(jié)果回調(diào)給調(diào)度中心,供用戶查看。
- 心跳檢測:周期性地向調(diào)度中心發(fā)送心跳信息,證明自己的存活狀態(tài)。
三、XXL-JOB的調(diào)度機(jī)制
時間輪調(diào)度
XXL-JOB的調(diào)度機(jī)制借鑒了Netty中的HashedWheelTimer,采用了類似時間輪的調(diào)度方式。時間輪是一個環(huán)形結(jié)構(gòu),可以想象成一個時鐘,鐘面上有很多格子(bucket),每個格子上可以存放多個任務(wù)。隨著時間的流逝,時間輪上的指針會一格一格地轉(zhuǎn)動,并執(zhí)行對應(yīng)格子上的任務(wù)。
在XXL-JOB中,時間輪被簡化成了60個bucket,每個bucket代表1秒。調(diào)度中心內(nèi)部有兩個重要的線程:scheduleThread和ringThread。scheduleThread負(fù)責(zé)預(yù)讀未來5秒內(nèi)即將觸發(fā)的任務(wù),并將它們放入時間輪中。ringThread則負(fù)責(zé)檢查當(dāng)前bucket和前一個bucket中的任務(wù),并取出執(zhí)行。
這種調(diào)度方式的好處在于,它能夠在內(nèi)存中以極低的成本維護(hù)一個高效的任務(wù)調(diào)度隊列,避免了頻繁訪問數(shù)據(jù)庫帶來的性能開銷。
任務(wù)分配與執(zhí)行
當(dāng)任務(wù)到達(dá)觸發(fā)時間時,調(diào)度中心會根據(jù)任務(wù)的配置信息和執(zhí)行器的注冊信息,選擇合適的執(zhí)行器來執(zhí)行任務(wù)。這里涉及到XXL-JOB的路由策略,包括第一個、最后一個、輪詢、隨機(jī)、一致性Hash等多種策略。
- 第一個/最后一個:直接選擇注冊列表中的第一個或最后一個執(zhí)行器。
- 輪詢:依次選擇注冊列表中的執(zhí)行器,實現(xiàn)負(fù)載均衡。
- 隨機(jī):隨機(jī)選擇一個執(zhí)行器來執(zhí)行任務(wù)。
- 一致性Hash:通過一致性Hash算法,將任務(wù)均勻分配到各個執(zhí)行器上,實現(xiàn)負(fù)載均衡的同時,減少節(jié)點增減對任務(wù)分配的影響。
執(zhí)行器接收到任務(wù)后,會基于線程池執(zhí)行任務(wù),并將執(zhí)行結(jié)果放入內(nèi)存隊列中。執(zhí)行器的回調(diào)線程會消費這個隊列中的結(jié)果,并主動上報給調(diào)度中心。用戶可以在調(diào)度中心查看任務(wù)的執(zhí)行日志和結(jié)果。
四、XXL-JOB的高級特性
彈性擴(kuò)容縮容
XXL-JOB支持執(zhí)行器的動態(tài)注冊和注銷,這意味著當(dāng)有新的執(zhí)行器機(jī)器上線或者下線時,調(diào)度中心能夠在下次調(diào)度時重新分配任務(wù),實現(xiàn)彈性擴(kuò)容縮容。這種特性使得XXL-JOB能夠輕松應(yīng)對業(yè)務(wù)量的變化,提高系統(tǒng)的靈活性和可擴(kuò)展性。
豐富的觸發(fā)策略
XXL-JOB提供了多種任務(wù)觸發(fā)策略,包括Cron觸發(fā)、固定間隔觸發(fā)、固定延時觸發(fā)、API觸發(fā)、人工觸發(fā)、父子任務(wù)觸發(fā)等。這些觸發(fā)策略可以滿足不同場景下的需求,使得任務(wù)調(diào)度更加靈活和高效。
任務(wù)失敗重試與告警
當(dāng)任務(wù)執(zhí)行失敗時,XXL-JOB支持自定義任務(wù)失敗重試次數(shù),并在達(dá)到重試次數(shù)上限后發(fā)送告警通知。告警方式包括郵件、短信等多種方式,用戶可以根據(jù)實際需求進(jìn)行配置。這種機(jī)制保證了任務(wù)的高可用性和可靠性。
五、總結(jié)
通過對XXL-JOB內(nèi)部機(jī)制的揭秘,我們可以看到它在任務(wù)調(diào)度方面的強(qiáng)大功能和高效實現(xiàn)。從調(diào)度中心到執(zhí)行器,從時間輪調(diào)度到任務(wù)分配與執(zhí)行,再到彈性擴(kuò)容縮容、豐富的觸發(fā)策略和任務(wù)失敗重試與告警等高級特性,XXL-JOB以其輕量級、易擴(kuò)展、高性能的特點贏得了市場的認(rèn)可。如果你正在尋找一個穩(wěn)定可靠的分布式任務(wù)調(diào)度平臺來優(yōu)化你的系統(tǒng)架構(gòu)和提升業(yè)務(wù)效率那么XXL-JOB絕對值得你一試!讓任務(wù)飛起來不再是夢!