ScheduleMaster提供分布式任務調度功能,可以幫助用戶在軟件上配置工作方案,讓復雜、多線程的任務運行更加流暢,對于需要建立任務調度系統的朋友很有幫助,您可以在軟件上管理設備,可以建立設備任務執行流程,可以設置任務依賴以及觸發條件,可以實時監控項目運行過程,可以在軟件查看運行狀態,可以實時監控報警項目,讓用戶可以更好遠程,更好配置調度方案;ScheduleMaster可以快速創建新的工作任務,您可以控制任務啟動和停止,可以設置異常報警提醒方案,可以對調度任務統計,提供的功能非常多!
ScheduleMaster軟件功能
基于.NET Core 3.1平臺構建,支持跨平臺多節點部署運行。
簡易的Web UI作;
任務動態管理:創建、啟動、停止、暫停、恢復、刪除等;
高可用支持,跨平臺多節點部署。
數據安全,不會出現多實例并發調度。
支持自定義參數設置;
支持.NET Core和.net framework(4.6.1+);
支持自定義配置文件和熱更新;
支持設置監護人,運行異常時郵件告警;
支持設置任務依賴,自動觸發,共享任務結果;
插件式開發,任務運行環境隔離;
全鏈路志系統,運行軌跡輕松掌控;
用戶訪問控制;
提供開放REST API,業務系統可以無縫集成;
調度報表統計;
任務分組管理;
計劃表拆分實現復用;
指定節點運行;
支持http任務配置;
支持延時任務;
任務監控;
資源監控;
支持異常策略配置(失敗重試、超時控制等);
接入redis緩存;
多數據庫類型支持;
用戶權限更加精細化;
報表統計完善;
ScheduleMaster軟件特色
1、ScheduleMaster可以幫助用戶配置任務調度方案
2、可以設置工作方案,可以對復雜的數據訪問流程調度
3、支持系統配置功能,可以在軟件對節點設置,可以對響應方式設置
4、支持郵件功能,您可以在軟件配置郵件提醒方案
5、支持HTTP設置功能,可以設置HTTP任務執行時的超時時間。
6、可以在軟件配置任務,可以添加任務節點
7、支持參數配置,在軟件設置任務配置方案,設置參數
8、支持動態參數啟動,支持配置文件啟動,支持志跟蹤
ScheduleMaster教程
一、部署方式介紹
由于.NET Core天生就對云原生的友好支持,本項目針對各種部署場景提供了多種簡單有效的方式。
從不同角度來看,它又支持不同的形式。
– 按應用配置角度:支持**靜態配置文件**和**運行時動態參數**。
– 按應用啟動角度:支持**自動注冊模式**和**手動連接模式**。
以上幾種方式都是互相結合使用,相輔相成的。
再稍微解釋下本項目涉及的幾個核心概念:
– **Master**:系統主控制臺,表現上是一個ASP.NET Core MVC的web應用,它是所有任務和節點的控制中心,是用戶和調度系統的交互窗口。
– **Worker**:任務執行器,也就是實際執行任務的載體,由Master通過HTTP的方式進行管理。
– **Node(節點)**:運行了Master或Worker的一個web進程,系統要運行必須要至少啟動2個節點,也就是1個Master和至少1個Worker。
> 要注意的是,Master和Worker必須使用同一個數據庫。
### 靜態配置文件啟動
這是項目早期唯一支持的啟動方式,在節點啟動前通過修改配置文件`appsettings.json`中指定配置項`NodeSetting`的參數實現節點配置。
在自動注冊模式下,這些配置將被注冊到數據庫中,成為節點間互相訪問的依據。
在手動連接模式下,配置將會失效,這時候節點間訪問完全依賴于在控制臺中手動配置的。
> 要注意的是,Master只提供了自動注冊模式,也就是必須要在啟動前配置好參數,而Worker可以支持上面提到的2種模式,下同。
這種啟動方式適合節點數不是很多,并且使用傳統部署方式的場景。
### 動態參數啟動
在很多場景下,使用配置文件并不是一種好的方案,特別是參數中的IP和端口并不好提前預定,很典型的是在使用Docker部署的情況下需要根據不同的配置文件生成不同的鏡像,又或者是使用Kubernetes進行節點彈伸縮時非常不便,這是不能忍受的。
為了充分適應容器部署,我設計了動態參數啟動模式,支持使用運行時參數改變節點配置。
在自動注冊模式下,可以使用命令行參數覆蓋對應的配置文件參數,對應的參數名分別是:`–identity`、`–ptocol`、`–ip`、`–port`、`–poty`、`–maxc`,這種模式下還是要依賴于配置文件,只是動態參數有更高的優先級。
在手動連接模式下,節點依賴于控制臺中的配置,**但是必須要使用動態參數告訴應用禁用自動注冊**,有如下2種方式:
– 使用環境變量,設置 **`CORE_AUTOR=false`** 和 **`CORE_WORKEROF=你的master節點名稱`**。
– 使用命令行參數,設置 **`–tor=false`** 和 **`–workef=你的master節點名稱`**。
有了動態參數,我們可以使用一個Docker鏡像,通過不同啟動參數就能部署多個節點。而有了手動連接方式,可以非常方便的使用Kubernetes對節點做彈伸縮。
**系統默認情況下是以配置文件和自動注冊模式啟動。
二、動態參數啟動
參考《配置文件啟動》的步驟先獲得項目的發布文件。
動態參數對自動注冊模式和手動連接模式都有效,下面分別介紹這兩種模式下的使用。
### 自動注冊節點
這是系統默認的啟動方式,適用于Master和Worker,除非顯式聲明禁用。
禁用方式為使用環境變量 **`CORE_AUTOR=false`** 或者命令行參數 **`–tor=false`** ,禁用的同時必須指定要連接的Master節點名稱: **`CORE_WORKEROF=你的master節點名稱`** 或者 **`–workef=你的master節點名稱`**。注意:禁用只對Worker部署有效!
自動注冊模式下支持配置文件+命令行參數的配置方式,如果設置了命令行參數則會覆蓋對應的配置文件參數。
#### 在Windows中運行
演示如何使用命令行參數覆蓋配置文件中的IP和端口字段(假設配置文件中的IP是localhost,端口是100):
* 找到Master的發布目錄,執行命令`dotnet Hos.ScheduleMaster.Web.dll –ip=192.168.8.27 –port=30000`啟動程序。
* 找到Worker的發布目錄,執行命令`dotnet Hos.ScheduleMaster.QuartzHost.dll –urls http://*:30001 –identity=worker1 –ip=192.168.8.27 –port=30001`啟動程序。
“`
* 還是在這個Worker的發布目錄,執行命令`dotnet Hos.ScheduleMaster.QuartzHost.dll –urls http://*:30002 –identity=worker2 –ip=192.168.8.27 –port=30002`即可再啟動一個Worker進程。
“` shell
“`
打開Master的控制臺,進入節點管理頁面,發現命令行參數已生效。
#### 在Linux中運行
作步驟同上。
#### 在Docker中運行
* 在Master的發布目錄中執行`docker build -t ms_master .`命令生成master鏡像,再執行`docker run -d -p 30000:30000 –name=”mymaster” ms_master bash –ip=192.168.8.27 –port=30000`運行容器。
“` shell
[ot@master1 ms_master]# docker run -d -p 30000:30000 –name=”mymaster” ms_master –ip=192.168.8.27 –port=30000
3bbbec2398d9147f9aa1d9e57a4741385ffd33558f83320d62a92d011e9aa143
“`
* 在Worker的發布目錄中執行`docker build -t ms_worker .`命令生成worker鏡像,再執行`docker run -d -p 30001:80 –name=”myworker1″ ms_worker bash –identity=docker-worker1 –ip=192.168.8.27 –port=30001`運行容器啟動worker1。
“` shell
[ot@master1 ms_worker1]# docker run -d -p 30001:80 –name=”myworker1″ ms_worker bash –identity=docker-worker1 –ip=192.168.8.27 –port=30001
5e446997d4a28b3c6ec0708a88d42a4d6baad1e5d5ae686d88c03e99c4e2003f
“`
* 繼續執行`docker run -d -p 30002:80 –name=”myworker2″ ms_worker bash –identity=docker-worker2 –ip=192.168.8.27 –port=30002`運行容器啟動worker2。
“` shell
[ot@master1 ms_worker2]# docker run -d -p 30002:80 –name=”myworker2″ ms_worker bash –identity=docker-worker2 –ip=192.168.8.27 –port=30002
0cad44660657d2251e71b73a46189117ec3aad1445c5176276d32fa06360d56e
“`
* 執行`docker ps`查看各容器運行狀態,如果運行不起來請容器log。
可以看到不需要重復給不同的Worker生成鏡像了,如果你不使用容器編排工具部署,以上方式已經足夠了。
### 手動連接模式
手動連接模式要解決的核心問題是那些不能提前預知IP和端口以及Worker平滑伸縮的場景,使用命令行參數依然要給每個容器(應用)單獨指定配置,使用Kubernetes Deployment做伸縮時還是不方便。
這時候可以禁用自動注冊,采用手動連接方式和Worker建立通信。下面只介紹在Windows下的使用方式,其他平臺也是類似。
* 第一步先啟動Worker進程:
“` shell
“`
* 第二步在控制臺創建一個節點(注意這里的主機地址要填Worker真實監聽的地址):

* 第三步對節點執行“連接”作,可以看到節點連接成功:
“` shell
info: Hos.ScheduleMaster.QuartzHost.Contllers.QuartzContller[0]
succesully connected to master-node!
“`
節點連接成功后是空閑狀態,可以對它執行“啟用”開啟調度功能。
> 小提示:對于這種部署場景,最好的辦法是在項目屬中設置環境變量徹底禁用自動注冊(或者在Dockerfile中設置環境變量),這樣就不用每次通過命令行參數禁用了。
三、編寫業務代碼
只有在程序集任務下才需要編寫自己的業務代碼,這種方式雖然實施起來比較麻煩,但靈活更好。
接入流程為:**安裝依賴包 -> 開發業務代碼 -> 打包上傳 -> 創建任務**
### 安裝依賴包
– 編譯項目后手動添加引用程序集文件`Hos.ScheduleMaster.Base.dll`。
– 在nuget中搜索`ScheduleMaster`直接安裝到項目中。
– 程序包管理控制臺中使用`install-package ScheduleMaster`安裝。
– 在命令行中使用`dotnet add package ScheduleMaster`安裝。
### 開發業務代碼
業務代碼類必須繼承自任務基類`Hos.ScheduleMaster.Base.TaskBase`,其中的象方法`public abstract void Run(TaskContext context);`即是業務執行入口,所以只需要重寫這個象方法即可。
下面是一個最簡單的示例:
#### 使用自定義配置文件:
“`
#### 上下級任務結果傳遞:
#### 取消一個長任務:
“`
更多的代碼示例可以參考源碼中的`Hos.ScheduleMaster.Demo`項目,如果您發現了更好的使用場景,歡迎提PR和大家一起分享。
### 打包上傳
業務代碼開發完成后需要把項目編譯成dll文件,并以項目名稱為文件名把和業務有關的dll文件以及配置文件打包成一個.zip壓縮包,您可以選擇兩種方式進行上傳:
– 在控制臺創建任務時通過上傳入口上傳文件包。
– 使用文件傳輸方式把文件包上傳到master進程的`/wwwot/plugins/`目錄下,大文件包推薦這種方式。
在打包和更新文件的過程中有幾點要特殊注意下:
– 文件包的命名務必以任務所在的程序集名稱命名,否則無法啟動。
– 在一個項目中開發了多個任務入口,文件包只需要上傳一次即可,但是要注意上傳的版本是否覆蓋到你所有的任務。
– 任務啟動時會默認加載最新的文件包,如果不想使用最新版本可以用系統參數`程序集任務-文件包拉取策略`進行設置。
– 打包時不需要把`Hos.ScheduleMaster.Base.dll`包含進去,否則會啟動失敗。
– 業務代碼盡量減少第三方dll依賴,否則會使得文件包太大導致啟動時無法預估的異常。