更新時(shí)間:2018-08-17 來(lái)源:黑馬程序員技術(shù)社區(qū) 瀏覽量:
1. Elastic Job1.1前言
我們開(kāi)發(fā)定時(shí)任務(wù)一般都是使用quartz或者spring-task,無(wú)論是使用quartz還是spring-task,我們至少會(huì)遇到以下兩個(gè)痛點(diǎn):
l 不敢輕易跟著應(yīng)用服務(wù)器多節(jié)點(diǎn)部署,可能會(huì)重復(fù)多次執(zhí)行而引發(fā)系統(tǒng)邏輯的錯(cuò)誤。
l quartz的集群僅僅只是用來(lái)HA,節(jié)點(diǎn)數(shù)量的增加并不能給我們的每次執(zhí)行效率帶來(lái)提升,即不能實(shí)現(xiàn)水平擴(kuò)展。
說(shuō)明:Elastic-job分布式任務(wù)調(diào)度,就可以幫我們解決上面兩個(gè)痛點(diǎn)。
1.2介紹
Elastic-Job是當(dāng)當(dāng)開(kāi)源的一款非常好用的分布式任務(wù)調(diào)度框架,由兩個(gè)相互獨(dú)立的子項(xiàng)目Elastic-Job-Lite和Elastic-Job-Cloud組成。Elastic-Job-Lite定位為輕量級(jí)無(wú)中心化解決方案,使用jar包的形式提供分布式任務(wù)的協(xié)調(diào)服務(wù)。Elastic-Job-Lite這也是本次所要講解和使用的子項(xiàng)目。
主要功能:
l 分布式調(diào)度協(xié)調(diào)
l 彈性擴(kuò)容縮容
l 失效轉(zhuǎn)移
l 錯(cuò)過(guò)執(zhí)行作業(yè)重觸發(fā)
l 作業(yè)分片一致性,保證同一分片在分布式環(huán)境中僅一個(gè)執(zhí)行實(shí)例
l 自診斷并修復(fù)分布式不穩(wěn)定造成的問(wèn)題
l 支持并行調(diào)度
l 支持作業(yè)生命周期操作
l 豐富的作業(yè)類(lèi)型
l Spring整合以及命名空間提供
l 運(yùn)維平臺(tái)
官網(wǎng):http://www.elasticjob.io/
1.3基本概念
n 分片概念
任務(wù)的分布式執(zhí)行,需要將一個(gè)任務(wù)拆分為多個(gè)獨(dú)立的任務(wù)項(xiàng),然后由分布式的服務(wù)器分別執(zhí)行某一個(gè)或幾個(gè)分片項(xiàng)。
例如:有一個(gè)遍歷數(shù)據(jù)庫(kù)某張表的作業(yè),現(xiàn)有2臺(tái)服務(wù)器。為了快速的執(zhí)行作業(yè),那么每臺(tái)服務(wù)器應(yīng)執(zhí)行作業(yè)的50%。 為滿足此需求,可將作業(yè)分成2片,每臺(tái)服務(wù)器執(zhí)行1片。
n 分片項(xiàng)與業(yè)務(wù)處理解耦
Elastic-Job并不直接提供數(shù)據(jù)處理的功能,框架只會(huì)將分片項(xiàng)分配至各個(gè)運(yùn)行中的作業(yè)服務(wù)器,開(kāi)發(fā)者需要自行處理分片項(xiàng)與真實(shí)數(shù)據(jù)的對(duì)應(yīng)關(guān)系。
n 個(gè)性化參數(shù)的適用場(chǎng)景
個(gè)性化參數(shù)即shardingItemParameter,可以和分片項(xiàng)匹配對(duì)應(yīng)關(guān)系,用于將分片項(xiàng)的數(shù)字轉(zhuǎn)換為更加可讀的業(yè)務(wù)代碼。
例如:按照地區(qū)水平拆分?jǐn)?shù)據(jù)庫(kù),數(shù)據(jù)庫(kù)A是北京的數(shù)據(jù);數(shù)據(jù)庫(kù)B是上海的數(shù)據(jù);數(shù)據(jù)庫(kù)C是廣州的數(shù)據(jù)。 如果僅按照分片項(xiàng)配置,開(kāi)發(fā)者需要了解0表示北京;1表示上海;2表示廣州。 合理使用個(gè)性化參數(shù)可以讓代碼更可讀,如果配置為0=北京,1=上海,2=廣州,那么代碼中直接使用北京,上海,廣州的枚舉值即可完成分片項(xiàng)和業(yè)務(wù)邏輯的對(duì)應(yīng)關(guān)系。
n 分布式調(diào)度
Elastic-Job-Lite并無(wú)作業(yè)調(diào)度中心節(jié)點(diǎn),而是基于部署作業(yè)框架的程序在到達(dá)相應(yīng)時(shí)間點(diǎn)時(shí)各自觸發(fā)調(diào)度。注冊(cè)中心僅用于作業(yè)注冊(cè)和監(jiān)控信息存儲(chǔ)。而主作業(yè)節(jié)點(diǎn)僅用于處理分片和清理等功能。
n 作業(yè)高可用
Elastic-Job-Lite提供最安全的方式執(zhí)行作業(yè)。將分片總數(shù)設(shè)置為1,并使用多于1臺(tái)的服務(wù)器執(zhí)行作業(yè),作業(yè)將會(huì)以1主n從的方式執(zhí)行。
一旦執(zhí)行作業(yè)的服務(wù)器崩潰,等待執(zhí)行的服務(wù)器將會(huì)在下次作業(yè)啟動(dòng)時(shí)替補(bǔ)執(zhí)行。開(kāi)啟失效轉(zhuǎn)移功能效果更好,可以保證在本次作業(yè)執(zhí)行時(shí)崩潰,備機(jī)立即啟動(dòng)替補(bǔ)執(zhí)行。
n 最大限度利用資源
Elastic-Job-Lite也提供最靈活的方式,最大限度的提高執(zhí)行作業(yè)的吞吐量。將分片項(xiàng)設(shè)置為大于服務(wù)器的數(shù)量,最好是大于服務(wù)器倍數(shù)的數(shù)量,作業(yè)將會(huì)合理的利用分布式資源,動(dòng)態(tài)的分配分片項(xiàng)。
例如:3臺(tái)服務(wù)器,分成10片,則分片項(xiàng)分配結(jié)果為服務(wù)器A=0,1,2;服務(wù)器B=3,4,5;服務(wù)器C=6,7,8,9。 如果服務(wù)器C崩潰,則分片項(xiàng)分配結(jié)果為服務(wù)器A=0,1,2,3,4;服務(wù)器B=5,6,7,8,9。在不丟失分片項(xiàng)的情況下,最大限度的利用現(xiàn)有資源提高吞吐量。
作業(yè)類(lèi)型說(shuō)明
Elastic-Job提供Simple、Dataflow和Script 3種作業(yè)類(lèi)型。 方法參數(shù)shardingContext包含作業(yè)配置、分片和運(yùn)行時(shí)信息。可通過(guò)getShardingTotalCount(),getShardingItem()等方法分別獲取分片總數(shù),運(yùn)行在本作業(yè)服務(wù)器的分片序列號(hào)等。
l Simple類(lèi)型作業(yè)
意為簡(jiǎn)單實(shí)現(xiàn),未經(jīng)任何封裝的類(lèi)型。需實(shí)現(xiàn)SimpleJob接口。該接口僅提供單一方法用于實(shí)現(xiàn),此方法將定時(shí)執(zhí)行。與Quartz原生接口相似,但提供了彈性擴(kuò)縮容和分片等功能。
l Dataflow類(lèi)型作業(yè)
Dataflow類(lèi)型用于處理數(shù)據(jù)流,需實(shí)現(xiàn)DataflowJob接口。該接口提供2個(gè)方法可供實(shí)現(xiàn),分別用于抓取(fetchData)和處理(processData)數(shù)據(jù)。
l Script類(lèi)型作業(yè)
作者:黑馬程序員JavaEE培訓(xùn)學(xué)院
首發(fā):http://www.itheima.com/special/hmjavaeezly/index.shtml