rabbitGYK 關注java
2016.11.27 20:36* 字數 1446 閱讀 7141評論 5喜歡 36讚揚 1node
博客原文linux
做爲一個支付公司的項目組,常常會有不少對帳功能(簽約對帳、支付訂單對帳、記帳對帳),這些都是以定時任務的形式實現,組內常常須要維護一些定時任務,在使用過程當中主要關注定時任務的穩定性、健壯性和可控性,分佈式定時任務+任務監控基本知足使用需求。git
就定時任務來講,首先是操做系統層面一直支持的功能,因此咱們的各類對定時任務的實現手段才能得以發揮。因爲操做系統和編程語言種類繁多,本文中將重點從linux操做系統、java語言以及java生態中開源框架來介紹定時任務。github
1. linux系統級的定時任務執行器:crontab
這是一個系統級的定時器,具備靈活簡單的特性,同時也是缺少管理功能和分佈式支持。通常的使用方法是,使用shell腳本調用業務實現jar包。spring
2. java語言中的定時器:java.util.Timer
這是一個java語言內置的定時器,這是全部基於java語言的開源框架實現的基礎。其中,典型的任務調度方法:shell
public void schedule(TimerTask task, long delay); public void schedule(TimerTask task, Date time); public void schedule(TimerTask task, long delay, long period); public void schedule(TimerTask task, Date firstTime, long period); public void scheduleAtFixedRate(TimerTask task, long delay, long period); public void scheduleAtFixedRate(TimerTask task, Date firstTime, long period);
3. java定時任務開源框架(經常使用)
3.1. Quartz(java定時任務的標準)
3.2. spring task
在spring中實現定時任務有兩種方式,一是spring對quartz進行了封裝,二是獨立實現了定時任務的調度器稱爲spring task
。其中spring task相對較爲簡單,cron表達式不支持L W
;而quartz不但完整支持cron表達式,並且具備不少高級特性,如JDBCJobStore(做業倉庫)、集羣模式。編程
4. 分佈式定時任務開源框架
4.1. Elastic-Job(噹噹網)
4.2. light-task-scheduler
4.3. clover
4.4. TBSchedule(阿里)
4.5. niubi-job
4.6. Uncode-Schedule
基於java的分佈式定時任務的開源框架仍是不少的,這裏沒有一一列舉,有些框架設計的很是完善複雜,可根據具體使用場景選擇適當的框架,當某些功能不符合你的預期的時候,能夠去修改一下源代碼實現本身想要的功能,這是開源框架的好處。架構
根據咱們全部定時任務的特色和實際運行需求,我選擇了Uncode-Schedule框架,這個框架相對簡單、靈活,而且修改源代碼以知足特定需求相對容易。框架
對於分佈式應用來講,一致性始終是首要問題,另外就是對任務和執行任務的機器的管理問題。
1. 一致性問題
1.1. 一個任務不能同時在多臺機器上執行
1.2. 當某一臺執行任務的機器宕機時,該機器上的任務自動從新分配至其餘機器
1.3. 任務的均衡分配
1.4. 心跳檢測
2. 任務的管理和監控
2.1. 任務的動態添加和刪除
2.2. 控制執行任務的機器
2.3. 隨時手動執行任務
Uncode-Schedule是一個實現分佈式定時任務的開源框架,java語言實現,本章將從上面的幾個問題入手分析該框架的實現機制。
1. 功能概述
Uncode-Schedule是基於zookeeper的分佈式任務調度組件,很是小巧,使用簡單,開發時只須要引入jar包,不須要單獨部署服務端。並且定時任務的實現方式和原始的spring/quartz task保持一致,因此普通的定時任務改形成分佈式很方便。
1.1. 它可以確保全部任務在集羣中不重複,不遺漏的執行。
1.2. 單節點故障時,任務可以自動轉移到其餘節點繼續執行。
1.3. 支持動態添加和刪除任務。
1.4. 支持添加機器ip黑名單。
1.5. 支持手動執行任務。
2. 注意事項
在使用Uncode-Schedule框架開發定時任務時,須要注意幾個問題:
2.1. 開發的定時任務在業務要保證冪等性。主要是爲了解決單點故障時,任務轉移重複執行帶來的問題。
2.2. 任務節點啓動時必須保證zookeeper可用。
2.3. 任務節點運行期zookeeper集羣不可用時任務節點保持可用前狀態運行,當zookeeper集羣恢復後,任務正常運行。
2.4. 手動執行任務時,須要選擇在哪臺機器執行。
3. 模塊架構
3.1. Uncode-Schedule分佈式定時任務的設計結構以下圖:
Uncode-Schedule架構圖
zookeeper集羣負責存儲定時任務和機器的數據,起到存儲數據和保持一致性的關鍵做用。在全部的執行任務的節點中有一個leader,它會負責任務的分配。任務的管理和監控平臺可單獨部署。
3.2. 每個任務節點的內部結構以下圖:
worker node結構圖
執行任務的節點上支持的任務類型包括spring的封裝的quartz任務和spring task;另外該框架還自定義了一種任務Uncode Task,其實是一種由zookeeper存儲調度信息的任務,最終仍是由spring的調度器ThreadPoolTaskScheduler
控制的,不過這種任務是可動態添加和刪除的。
3. 使用方法
Uncode-Schedule框架的使用方法是很簡單的,並且我也沒有對原做者的使用方法作修改,因此具體使用方法可參考github上的README文檔。
我根據對框架的功能完善,本身設計了一個任務的管理和監控平臺。主要在其中添加了手動執行的功能,其餘的監控功能會進一步完善。
4. 源碼分析
見下一篇文章。
轉載自: http://rabbitgyk.com/2018/01/27/uncode-schedule-framework/ https://www.jianshu.com/p/780235132d81