小編比較推崇成體系的學習,不管是什麼樣的技術,流行或者不流行,均可以造成一整套知識體系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的設計模式同樣,平時不多能用到那麼多,可是你不會能夠嗎?答案是必定的,確定不行,那麼一樣的,咱們是公司業務容許我大展身手能夠本身發展,可是要是公司不能讓你自由發揮呢?仍是要用現成的不是嗎?接下來看一下我整理的比較經常使用的分佈式任務調度系統
https://gitee.com/benjobs/ope...
opencron 是一個功能完善且通用的開源定時任務調度系統,擁有先進可靠的自動化任務管理調度功能,提供可操做的 web 圖形化管理知足多種場景下各類複雜的定時任務調度,同時集成了 linux 實時監控、webssh 等功能特性。
你是否有定時執行任務計劃的需求,須要在linux的crontab裏一必定義任務?
https://gitee.com/hugui/light...
LTS,light-task-scheduler,是一款分佈式任務調度框架, 支持實時任務、定時任務和 Cron 任務。有較好的伸縮性和擴展性,提供對 Spring 的支持(包括 Xml 和註解),提供業務日誌記錄器。支持節點監控、任務執行監、JVM 監控,支持動態提交、更改、中止任務。
完整的示例代碼:
https://github.com/ltsopensou...
https://gitee.com/xuxueli0323...
http://www.xuxueli.com/xxl-job
XXL-JOB 是一個輕量級分佈式任務調度框架,支持經過 Web 頁面對任務進行 CRUD 操做,支持動態修改任務狀態、暫停/恢復任務,以及終止運行中任務,支持在線配置調度任務入參和在線查看調度結果。
https://gitee.com/elasticjob/...
Elastic-Job 是一個分佈式調度解決方案,由兩個相互獨立的子項目 Elastic-Job-Lite 和 Elastic-Job-Cloud 組成。定位爲輕量級無中心化解決方案,使用 jar 包的形式提供分佈式任務的協調服務。支持分佈式調度協調、彈性擴容縮容、失效轉移、錯過執行做業重觸發、並行調度、自診斷和修復等等功能特性。
https://gitee.com/uncode/unco...
Uncode-Schedule 是基於 ZooKeeper + Quartz / spring task 的分佈式任務調度組件,確保每一個任務在集羣中不一樣節點上不重複的執行。支持動態添加和刪除任務,支持添加 ip 黑名單,過濾不須要執行任務的節點。
功能概述:
模塊機構:
https://github.com/ihaolin/an...
Antares 是一款基於 Quartz 機制的分佈式任務調度管理平臺,內部重寫執行邏輯,一個任務僅會被服務器集羣中的某個節點調度。用戶可經過對任務預分片,有效提高任務執行效率;也可經過控制檯 antares-tower 對任務進行基本操做,如觸發,暫停,監控等。
Antares總體架構:
Antares中的任務狀態機:
以爲整理的還算齊全的,歡迎點贊+關注給小編一點動力,後期會不斷更新相應的文章,謝謝
轉發分享給更多人,而後能夠私信「資料」獲取你須要的資料哦,只要你來,只要我有,小編毫不吝嗇關注公衆號:Java架構師聯盟,每日更新技術好文