1 什么是分布式任務調度
什么是分布式?
當前軟件的架構正在逐步轉變為分布式架構,將單體結構分為若干服務,服務之間通過網絡交互來完成用戶的業務
處理,如下圖,電商系統為分布式架構,由訂單服務、商品服務、用戶服務等組成:
分布式系統具體如下基本特點:
1、分布性:每個部分都可以獨立部署,服務之間交互通過網絡進行通信,比如:訂單服務、商品服務。
2、伸縮性:每個部分都可以集群方式部署,並可針對部分結點進行硬件及軟件擴容,具有一定的伸縮能力。
3、高可用:每個部分都可以集群部分,保證高可用。
什么是分布式調度?
通常任務調度的程序是集成在應用中的,比如:優惠卷服務中包括了定時發放優惠卷的的調度程序,結算服務中包
括了定期生成報表的任務調度程序,由於采用分布式架構,一個服務往往會部署多個冗余實例來運行我們的業務,
在這種分布式系統環境下運行任務調度,我們稱之為分布式任務調度,如下圖:
分布式調度要實現的目標:
不管是任務調度程序集成在應用程序中,還是單獨構建的任務調度系統,如果采用分布式調度任務的方式就相當於
將任務調度程序分布式構建,這樣就可以具有分布式系統的特點,並且提高任務的調度處理能力:
1、並行任務調度
並行任務調度實現靠多線程,如果有大量任務需要調度,此時光靠多線程就會有瓶頸了,因為一台計算機CPU的處
理能力是有限的。
如果將任務調度程序分布式部署,每個結點還可以部署為集群,這樣就可以讓多台計算機共同去完成任務調度,我
們可以將任務分割為若干個分片,由不同的實例並行執行,來提高任務調度的處理效率。
2、高可用
若某一個實例宕機,不影響其他實例來執行任務。
3、彈性擴容
當集群中增加實例就可以提高並執行任務的處理效率。
4、任務管理與監測
對系統中存在的所有定時任務進行統一的管理及監測。讓開發人員及運維人員能夠時刻了解任務執行情況,從而做
出快速的應急處理響應。
5、避免任務重復執行
當任務調度以集群方式部署,同一個任務調度可能會執行多次,比如在上面提到的電商系統中到點發優惠券的例
子,就會發放多次優惠券,對公司造成很多損失,所以我們需要控制相同的任務在多個運行實例上只執行一次,考
慮采用下邊的方法:
分布式鎖,多個實例在任務執行前首先需要獲取鎖,如果獲取失敗那么久證明有其他服務已經再運行,如果
獲取成功那么證明沒有服務在運行定時任務,那么就可以執行。
ZooKeeper 選舉,利用ZooKeeper對Leader實例執行定時任務,有其他業務已經使用了ZK,那么執行定時任
務的時候判斷自己是否是Leader,如果不是則不執行,如果是則執行業務邏輯,這樣也能達到我們的目的。
2 Elastic-Job介紹
針對分布式任務調度的需求市場上出現了很多的產品:
1)Elastic-job:當當網基於quartz 二次開發的彈性分布式任務調度系統,功能豐富強大,采用zookeeper實現分
布式協調,實現任務高可用以及分片。
2)Saturn: 唯品會開源的一個分布式任務調度平台,可以全域統一配置,統一監控,任務高可用以及分片並發處
理。它是在elastic-job基礎之上改良出來的。
3)xxl-job:大眾點評的分布式任務調度平台,是一個輕量級分布式任務調度平台,其核心設計目標是開發迅速、學
習簡單、輕量級、易擴展。現已開放源代碼並接入多家公司線上產品線,開箱即用。
4)TBSchedule:淘寶的一款非常優秀的高性能分布式調度框架,目前被應用於阿里、京東、支付寶、國美等很多
互聯網企業的流程調度系統中。
Elastic-Job是一個分布式調度的解決方案,由當當網開源,它由兩個相互獨立的子項目Elastic-Job-Lite和Elastic-
Job-Cloud組成,使用Elastic-Job可以快速實現分布式任務調度。
Elastic-Job的github地址:https://github.com/elasticjob
功能列表:
分布式調度協調
在分布式環境中,任務能夠按指定的調度策略執行,並且能夠避免同一任務多實例重復執行。
豐富的調度策略:
基於成熟的定時任務作業框架Quartz cron表達式執行定時任務。
彈性擴容縮容
當集群中增加某一個實例,它應當也能夠被選舉並執行任務;當集群減少一個實例時,它所執行的任務能被轉移到別的實例來執行。
失效轉移
某實例在任務執行失敗后,會被轉移到其他實例執行。
錯過執行作業重觸發
若因某種原因導致作業錯過執行,自動記錄錯過執行的作業,並在上次作業完成后自動觸發。
支持並行調度
支持任務分片,任務分片是指將一個任務分為多個小任務項在多個實例同時執行。
作業分片一致性
當任務被分片后,保證同一分片在分布式環境中僅一個執行實例。
支持作業生命周期操作
可以動態對任務進行開啟及停止操作。
豐富的作業類型
支持Simple、DataFlow、Script三種作業類型,后續會有詳細介紹。
Spring 整合以及命名空間支持
對Spring支持良好的整合方式,支持spring自定義命名空間,支持占位符。
運維平台
提供運維界面,可以管理作業和注冊中心。