一篇舊文了,以前在公衆號"CurdBoys" 中發過,文章連接 ,如今發一下在博客園上java
目前的場景是這樣的,咱們組內如今有不少舊或新的定時任務都是在直接在某些服務器上跑。若是遇到要下線某臺服務器,要先檢查一下這個服務器上是否還存在定時任務腳本。一般狀況下,即便找到該運行的定時任務腳本,也不知道它是用來作的或者是否能遷移到其餘機器上。另外,若是某臺機器掛了,上面的定時任務腳本也會掛了,不能自動切換到其餘機器上。linux
因爲存在着這種狀況,咱們就想着把這些定時任務腳本管理起來,而且須要具有高可用。這就須要一個分佈式調度任務系統。🧐git
關於定時執行任務的工具或框架系統有不少,通常狀況下針對不一樣的應用場景能夠選擇適合該場景下工具或框架。例如:若是不想引入其餘語言,只使用shell來執行的,可使用 linux Crontab 來執;若是是基於Spring 想着簡單實現一個定時任務,可使用@Scheduled註解。若是按照是否爲單獨的系統來分能夠分爲兩類:1. 系統或框架自帶的定時執行方法或工具。2. 單獨做爲一個服務的調度任務系統。github
只能單機執行與linux機器固定綁定,能夠經過cron 表達式定時執行shell腳本。簡單易使用,很差後期維護,只能執行shell腳本。spring
優勢:簡單,不用引入其餘框架。docker
缺點:shell
通常集成於項目中,小任務很方便,不能分佈式。注意,若是使用了,在集羣部署的時候須要使用分佈式鎖來限制數據庫
這部分主要的調度任務系統都是開源系統,而且大部分是基於Java的Quratz框架來封裝的服務器
XXL-JOB是一個分佈式任務調度平臺,其核心設計目標是開發迅速、學習簡單、輕量級、易擴展。架構
(美團公司我的開放)「調度中心」基於集羣Quartz實現,提供官方docker鏡像,做業與語言無關。社區較活躍,一直有維護狀態。 較多公司使用。
ElasticJob 是面向互聯網生態和海量任務的分佈式調度解決方案,由兩個相互獨立的子項目 ElasticJob-Lite 和 ElasticJob-Cloud 組成。 它經過彈性調度、資源管控、以及做業治理的功能,打造一個適用於互聯網場景的分佈式調度解決方案,並經過開放的架構設計,提供多元化的做業生態。 它的各個產品使用統一的做業 API,開發者僅需一次開發,便可隨意部署。
噹噹開源的,使用 Zookeeper 實現分佈式分佈式部署。2019年10月前中止維護過一段時間,後面才從新維護。而且在2020 年 5 月 28 日成爲 Apache ShardingSphere
的子項目將來前景應該很不錯。
Saturn (任務調度系統)是惟品會Venus體系的一個組成部分,負責分佈式的定時任務的調度,取代傳統的Linux Cron/Spring Batch Job的方式,作到全域統一配置,統一監控,任務高可用以及分片併發處理。Saturn基於噹噹Elastic Job代碼基礎上自主研發的任務調度系統。
惟品會開源的,基於elastic-job。支持多種語言做業,語言無關(Java/Go/C++/PHP/Python/Ruby/shell)。社區活躍度通常,小部分公司使用。
開源的有個好處就是大部分都是開箱即用。可是一般來講,若是直接使用開源的系統,後期改造起來都是比較麻煩,並且若是有什麼問題,排查起來也比較麻煩,畢竟不是本身的系統。基於咱們要求的調度任務系統,並不須要太多功能,因此咱們計劃本身基於Quartz框架來開發調度任務系統。
原生quartz任務的缺點
爲了解決原生Quartz的肯定,咱們基於Quartz和GRPC框架來開發任務調度系統,具體方案以下:
第一版項目地址:https://github.com/KANLON/job-scheduling (這個還不太完善,目前執行還不支持執行的高可用,後面須要修改執行任務的機器爲一個列表,遍歷該列表執行)
若是沒有時間或資源搭一套調度任務系統,可使用系統或框架自帶的定時執行方法或工具來簡單使用。若是須要統一管理,方便後期維護建議首先使用開源系統的。開源的分佈式調度任務系統中建議使用xxl-job
,該開源系統社區活躍度高,使用的公司數量相對較多,並且一直有在維護。
如下是我整理的思惟導圖: