首頁技術(shù)文章正文

Elastic Job 分布式任務(wù)調(diào)度

更新時(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://www.pantone-color.com.cn/special/hmjavaeezly/index.shtml

分享到:
在線咨詢 我要報(bào)名
和我們在線交談!