1. 程式人生 > >elastic-job的原理簡介

elastic-job的原理簡介

elastic-job :

1,簡介

      是噹噹開源的一款非常好用的作業框架,在這之前,我們開發定時任務一般都是使用quartz ,對於業務量小的話 quartz是可以滿足我們的要求的,使用quartz對於大的業務量的不足:

     a)quartz應用服務多節點部署,可能會重複多次執行而引發系統邏輯的錯誤 。

     b)quartz的叢集僅僅只是用來HA,節點數量的增加並不能給我們的每次執行效率帶來提升,即不能實現水平擴充套件。

對於定時任務quartz的不足,因此elastic-job應運而生。

2,使用場景:

     典型的job應用場景,比如餘額寶裡的昨日收益 ,job在每天某個時間點開始,給所有餘額寶使用者計算收益 ,如果使用者數量不多,我們可以輕易使用quartz來完成,我們讓計息job在某個時間點開始執行,迴圈遍歷所有使用者計算利息,這沒問題 ;如果使用者體量特別大,處理的時候可能出現的問題:

     a)我們可能會面臨著在第二天之前處理不完這麼多使用者(單節點的情況下,單個的job應用);

     b) 如果將quartz的job應用以多傑點部署的話,多個job同時執行,很容易造成重複執行,比如使用者重複計息,為了避免這種情況,我們可能會對job的執行加鎖,保證始終只有一個節點能執行,

出現這樣的情況 ,elastic-job可以幫我們完美地解決。

3,elastic-job的原理:

     a)elastic-job底層的任務排程還是使用的quartz,通過zookeeper來動態給job節點分片 ,通過叢集達到水平擴充套件,叢集裡的每個節點都處理部分使用者,不管使用者數量有多龐大,我們只要增加機器就可以了 ,單臺機器特定時間能處理n個使用者,2臺機器處理2n個使用者,3臺3n,4臺4n...,

    b)elastic-job開發的作業都是zookeeper的客戶端,比如我希望3臺機器跑job,我們將任務分成3片,框架通過zk的協調,最終會讓3臺機器分別分配到0,1,2的任務片,server0執行id%3==0的使用者,server1執行id%3==1的使用者,server2執行id%3==2的使用者;

    c)在上面的基礎上再增加一臺服務server3,此時server3分不到任務分片,因為只有3片,已經分完了。沒有分到任務分片的作業程式將不執行;如果此時server2掛了,那麼server2的分片項會分配給server3,server3有了分片,就會替代server2執行;如果此時server3也掛了,只剩下server0和server1了,框架也會自動把server3的分片隨機分配給server0或者server1