Disjob是一款分布式的任務調度框架,天然為支持分布式長任務執行而設計,它除了具備常規的任務調度功能外,還提供:任務拆分及分布式并行執行、暫停及取消運行中的任務、恢復執行被暫停的任務、任務執行失敗重試、保存任務的執行快照(Checkpoint)、任務依賴、任務編排(DAG)、廣播任務等能力。
以下是Disjob的整體流程圖:
特性
- 分為管理器(Supervisor)和執行器(Worker)兩種角色,Supervisor與Worker可分離部署
- Supervisor與Worker通過注冊中心相互發現,支持的注冊中心有:Database、Redis、Consul、Nacos、Zookeeper、Etcd
- Supervisor負責生成任務,把任務派發給Worker執行,支持的任務派發方式有:Redis、Http
- 需要指定Job的分組(job-group),Job的任務只會派發給指定組的Worker執行
- 提供拆分任務的能力,重寫拆分方法JobHandler#split即可拆分為多個任務,實現分布式任務及并行執行
- 支持暫停和取消運行中的任務,已暫停的任務可恢復繼續執行,執行失敗的任務支持重試
- 支持任務保存(savepoint)其執行狀態,讓手動或異常暫停的任務能從上一次的執行狀態中恢復繼續執行
- 任務在執行時若拋出PauseTaskException,會暫停對應實例下的全部任務(包括分布在不同worker機器中的任務)
- 支持廣播任務,廣播任務會派發給job-group下的所有worker執行
- 支持Job間的依賴,多個Job配置好依賴關系后便會按既定的依賴順序依次執行
- 支持DAG工作流,可把jobHandler配置為復雜的DAG表達式,如:A->B,C,(D->E)->D,F->G
- 提供Web管理后臺,通過界面進行作業配置,任務監控等
項目結構
disjob # 主項目①
├── disjob-admin # 管理后臺項目②(基于Ruoyi框架二次開發)
├── disjob-bom # Maven project bom module
├── disjob-common # 公共的工具類模塊
├── disjob-core # 任務調度相關的核心類(如數據模型、枚舉類、抽象層接口等)
├── disjob-dispatch # 任務派發模塊
│ ├── disjob-dispatch-api # 任務派發的抽象接口層
│ ├── disjob-dispatch-http # 任務派發的Http實現
│ └── disjob-dispatch-redis # 任務派發的Redis實現
├── disjob-id # 分布式ID生成模塊
├── disjob-registry # Server(Supervisor & Worker)注冊模塊
│ ├── disjob-registry-api # Server注冊中心的抽象接口層
│ ├── disjob-registry-consul # Server注冊中心:Consul實現
│ ├── disjob-registry-database # Server注冊中心:Database實現
│ ├── disjob-registry-etcd # Server注冊中心:Etcd實現
│ ├── disjob-registry-nacos # Server注冊中心:Nacos實現
│ ├── disjob-registry-redis # Server注冊中心:Redis實現
│ └── disjob-registry-zookeeper # Server注冊中心:Zookeeper實現
├── disjob-reports # 聚合各個模塊的測試覆蓋率報告
├── disjob-samples # Samples項目③
│ ├── disjob-samples-frameless-worker # Worker單獨部署的范例(普通Java-main應用)
│ ├── disjob-samples-springboot-common # Samples Spring-boot公共模塊
│ ├── disjob-samples-springboot-merged # Supervisor與Worker合并部署的范例(Spring-boot應用)
│ ├── disjob-samples-springboot-supervisor # Supervisor單獨部署的范例(Spring-boot應用)
│ └── disjob-samples-springboot-worker # Worker單獨部署的范例(Spring-boot應用)
├── disjob-supervisor # Supervisor代碼
├── disjob-test # 用于輔助測試
└── disjob-worker # Worker代碼
評論