大國驕傲,國產分佈式調度系統,你可能瞭解過,可是沒有深刻過

寫在前面:

小編比較推崇成體系的學習,不管是什麼樣的技術,流行或者不流行,均可以造成一整套知識體系java

不信的,能夠來看我最近的文章node

第一次見到這麼齊全的redis知識圖譜,老大不再用擔憂個人技術linux

成體系的學習能給本身帶來不少的幫助,不管是工做仍是面試仍是爲了你以後的發展,今天整理這篇文章也是由於前段時間,公司要改造現有的單節點調度爲分佈式任務調度,因此研究了不少的相關的文檔等資料,也就有了今天的文章git

當時爲了那個框架,自己想要省點事,研究了目前市面上主流的開源分佈式任務調度框架,可是最後用起來就一個感受:麻煩!特別是以前在一個類裏寫了好多個調度任務,改造起來更加麻煩。我這人又比較懶,總感受用了別人寫好的工具還要改一大堆,內心就有點不舒服。github

可是絕對不能拒絕說分佈式調度系統的重要性,中途插一句啊:web

分佈式調度系統的重要性

分佈式調度在互聯網企業中佔據着十分重要的做用,尤爲是電子商務領域,因爲存在數據量大、高併發的特色,對數據處理的要求較高,既要保證高效性,也要保證準確性和安全性,相對比較耗時的業務邏輯每每會從中剝離開來進行異步處理。面試

我的研發

因而我就想本身寫一個框架,畢竟本身以爲分佈式任務調度在全部分佈式系統中是最簡單的,由於通常公司任務調度自己不可能同時調度海量的任務,很大的併發,改形成分佈式主要仍是爲了分散任務到多個節點,以便同一時間處理更多的任務。redis

後面有一天,我在公司前臺取快遞,看到這樣一個現象:咱們好幾個同事(包括我)在前臺那從頭至尾看快遞是否是本身的,是本身的就取走,不是就忽略,而後我就收到了啓發。這個場景類比到分佈式調度系統中,咱們能夠認爲是快遞公司或者快遞員已經把每一個快遞按照咱們名字電話分好了快遞,咱們只須要取走本身的就好了。可是從另一個角度看,也能夠理解成咱們每一個人都是從頭至尾看了全部快遞,而後按照某種約定的規則,若是是本身的快遞就拿走,不是本身的就忽略繼續看下一個。若是把快遞想象成任務,一堆人去拿一堆快遞也能夠很順利的拿到各自的快遞,那麼一堆節點本身去取任務是否是也能夠很好的處理各自的任務呢?spring

就在這個靈感以後,我便開始行動,關鍵代碼附上設計模式

package com.rdpaas.task.scheduler;

import com.rdpaas.task.common.*;

import com.rdpaas.task.config.EasyJobConfig;

import com.rdpaas.task.repository.NodeRepository;

import com.rdpaas.task.repository.TaskRepository;

import com.rdpaas.task.strategy.Strategy;

import org.slf4j.Logger; import org.slf4j.LoggerFactory;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;

import java.util.Date; import java.util.List;

import java.util.concurrent.*;

/** * 任務調度器 *

@author rongdi *

@date 2019-03-13 21:15 */

@Component

public class TaskExecutor {

private static final Logger logger = LoggerFactory.getLogger(TaskExecutor.class);

@Autowired

private TaskRepository taskRepository;

@Autowired

private NodeRepository nodeRepository;

@Autowired

private EasyJobConfig config;

/** * 建立任務到期延時隊列 */

private DelayQueue<DelayItem<Task>> taskQueue = new DelayQueue<>();

/** * 能夠明確知道最多隻會運行2個線程,直接使用系統自帶工具就能夠了 */

private ExecutorService bossPool = Executors.newFixedThreadPool(2);

/** * 聲明工做線程池 */

private ThreadPoolExecutor workerPool;

@PostConstruct

public void init() {

/** * 自定義線程池,初始線程數量corePoolSize,線程池等待隊列大小queueSize,當初始線程都有任務,而且等待隊列滿後 * 線程數量會自動擴充最大線程數maxSize,當新擴充的線程空閒60s後自動回收.自定義線程池是由於Executors那幾個線程工具 * 各有各的弊端,不適合生產使用 */

workerPool = new ThreadPoolExecutor(config.getCorePoolSize(), config.getMaxPoolSize(), 60, TimeUnit.SECONDS, new ArrayBlockingQueue<>(config.getQueueSize()));

/** * 執行待處理任務加載線程 */

bossPool.execute(new Loader());

/** * 執行任務調度線程 */

bossPool.execute(new Boss());

} class Loader implements Runnable

好了,至此,基本結束,可是,就像java的設計模式同樣,平時不多能用到那麼多,可是你不會能夠嗎?答案是必定的,確定不行,那麼一樣的,咱們是公司業務容許我大展身手能夠本身發展,可是要是公司不能讓你自由發揮呢?仍是要用現成的不是嗎?接下來看一下我整理的比較經常使用的分佈式任務調度系統

國產平臺介紹

一、opencron

https://gitee.com/benjobs/ope...

opencron 是一個功能完善且通用的開源定時任務調度系統,擁有先進可靠的自動化任務管理調度功能,提供可操做的 web 圖形化管理知足多種場景下各類複雜的定時任務調度,同時集成了 linux 實時監控、webssh 等功能特性。

你是否有定時執行任務計劃的需求,須要在linux的crontab裏一必定義任務?

  • 須要在每臺linux服務器的crontab裏一必定義任務;
  • 任務的執行監控太不方便了;
  • 得登陸到每臺機器查看定時任務的運行結果,機器一多簡直是一種災難;
  • 對於多臺機器協同處理一個任務很麻煩,如何保證多臺機器上的任務按順序依次執行?
  • 當任務運行失敗,要從新執行,還得從新定義下執行時間,讓其重跑,重跑完成了還得改回正常時間;
  • 正在運行的任務要kill掉很麻煩,查看進程而後才能kill ......

大國驕傲,國產分佈式調度系統,你可能瞭解過,可是沒有深刻過

二、LTS

https://gitee.com/hugui/light...

LTS,light-task-scheduler,是一款分佈式任務調度框架, 支持實時任務、定時任務和 Cron 任務。有較好的伸縮性和擴展性,提供對 Spring 的支持(包括 Xml 和註解),提供業務日誌記錄器。支持節點監控、任務執行監、JVM 監控,支持動態提交、更改、中止任務。

完整的示例代碼:

https://github.com/ltsopensou...

大國驕傲,國產分佈式調度系統,你可能瞭解過,可是沒有深刻過

三、XXL-JOB

https://gitee.com/xuxueli0323...

http://www.xuxueli.com/xxl-job

大國驕傲,國產分佈式調度系統,你可能瞭解過,可是沒有深刻過

XXL-JOB 是一個輕量級分佈式任務調度框架,支持經過 Web 頁面對任務進行 CRUD 操做,支持動態修改任務狀態、暫停/恢復任務,以及終止運行中任務,支持在線配置調度任務入參和在線查看調度結果。

大國驕傲,國產分佈式調度系統,你可能瞭解過,可是沒有深刻過

四、Elastic-Job

https://gitee.com/elasticjob/...

Elastic-Job 是一個分佈式調度解決方案,由兩個相互獨立的子項目 Elastic-Job-Lite 和 Elastic-Job-Cloud 組成。定位爲輕量級無中心化解決方案,使用 jar 包的形式提供分佈式任務的協調服務。支持分佈式調度協調、彈性擴容縮容、失效轉移、錯過執行做業重觸發、並行調度、自診斷和修復等等功能特性。

大國驕傲,國產分佈式調度系統,你可能瞭解過,可是沒有深刻過

五、Uncode-Schedule

https://gitee.com/uncode/unco...

Uncode-Schedule 是基於 ZooKeeper + Quartz / spring task 的分佈式任務調度組件,確保每一個任務在集羣中不一樣節點上不重複的執行。支持動態添加和刪除任務,支持添加 ip 黑名單,過濾不須要執行任務的節點。

功能概述:

  • 基於zookeeper+spring task/quartz/uncode task的分佈任務調度系統。
  • 確保每一個任務在集羣中不一樣節點上不重複的執行。
  • 單個任務節點故障時自動轉移到其餘任務節點繼續執行。
  • 任務節點啓動時必須保證zookeeper可用,任務節點運行期zookeeper集羣不可用時任務節點保持可用前狀態運行,zookeeper集羣恢復正常運期。
  • 支持動態添加、修改和刪除任務,支持任務暫停和從新啓動。
  • 添加ip黑名單,過濾不須要執行任務的節點。
  • 後臺管理和任務執行監控。
  • 支持spring-boot,支持單個任務運行多個實例(使用擴展後綴)。

模塊機構:

大國驕傲,國產分佈式調度系統,你可能瞭解過,可是沒有深刻過

六、Antares

https://github.com/ihaolin/an...

Antares 是一款基於 Quartz 機制的分佈式任務調度管理平臺,內部重寫執行邏輯,一個任務僅會被服務器集羣中的某個節點調度。用戶可經過對任務預分片,有效提高任務執行效率;也可經過控制檯 antares-tower 對任務進行基本操做,如觸發,暫停,監控等。

Antares總體架構:

大國驕傲,國產分佈式調度系統,你可能瞭解過,可是沒有深刻過

Antares中的任務狀態機:

大國驕傲,國產分佈式調度系統,你可能瞭解過,可是沒有深刻過

以爲整理的還算齊全的,歡迎點贊+關注給小編一點動力,後期會不斷更新相應的文章,謝謝

轉發分享給更多人,而後能夠私信「資料」獲取你須要的資料哦,只要你來,只要我有,小編毫不吝嗇關注公衆號:Java架構師聯盟,每日更新技術好文

相關文章
相關標籤/搜索