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