<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
ScheduleMaster是分散式任務排程
系統,是國內的一位開發者寫的。簡稱:集中任務排程系統,最簡單的理解ScheduleMaster,就是對不同的系統裡面的排程任務做統一管理的框架。
例如我們現在有多個系統,每個系統針對自己處理不同的業務場景。衍生出自己的排程任務,想象一下,如果每個系統人為去維護,那隨著排程任務越來越多,人是崩潰的吧,可見維護和技術成本是巨大的,這時我們需要選擇分散式任務系統框架做統一的管理
當然有目前有很多相對優秀分散式任務系統框架,我們主要學習 ScheduleMaster
1.首先我們需要使用NET Core web Api建立幾個模擬的微服務,分別為 考勤、算薪、郵件、簡訊
2.下載開源的ScheduleMaster,並且使用ScheduleMaster排程我們的微服務介面
- sqlserver:"Persist Security Info = False; User ID =sa; Password =123456; Initial Catalog =schedule_master; Server =."
- postgresql:"Server=localhost;Port=5432;Database=schedule_master;User Id=postgres;Password=123456;Pooling=true;MaxPoolSize=20;"
- mysql:"Data Source=localhost;Database=schedule_master;User ID=root;Password=123456;pooling=true;CharSet=utf8mb4;port=3306;sslmode=none;TreatTinyAsBoolean=true"
修改Host的組態檔和支援的資料庫,框架預設使用Mysql
修改Web的組態檔和支援的資料庫,框架預設使用Mysql
3.進入Hos.ScheduleMaster.Web專案的釋出目錄,dotnet Hos.ScheduleMaster.Web.dll
啟動專案 ,此時會生成資料庫
登入賬號:admin
密碼:111111
4.進入Hos.ScheduleMaster.QuartzHost專案的釋出目錄,執行命令,啟動專案
dotnet Hos.ScheduleMaster.QuartzHost.dll --urls http://*:30003
5.準備就緒後,使用後臺檢視節點管理,可以看到web主節點30000和任務排程的介面30002已經在執行
6.使用任務列表選單,建立定時排程任務,設定基礎資訊和後設資料設定,然後點選儲存就開始執行任務
1.建立一個類庫,安裝ScheduleMaster庫, 建立一個類繼承TaskBase,實現抽象方法,然後編譯程式集
namespace TaskExcuteService { class AssemblyTask : TaskBase { public override void Run(TaskContext context) { context.WriteLog("程式集任務"); } } }
2.找到debug目錄,去掉Base程式集,然後新增為壓縮檔案
3.在web介面找到任務設定,選擇程式集進行基本設定,設定後設資料,輸入程式集名稱,然後輸入類,並將程式集上傳,儲存就可以執行了
為了方便業務系統更好的接入排程系統,ScheduleMaster建立任務不僅可以在控制檯中實現,系統也提供了WebAPI供業務系統使用程式碼接入,這種方式對延時任務來說尤其重要。
ms_auth_user
值。ms_auth_secret值
,計算規則:按{使用者名稱}{hash(密碼)}{使用者名稱}的格式拼接得到字串str,然後再對str做一次hash運算即得到最終祕鑰,hash函數是小寫的32位元MD5演演算法。HttpClient client = new HttpClient(); client.DefaultRequestHeaders.Add("ms_auth_user", "admin"); client.DefaultRequestHeaders.Add("ms_auth_secret", SecurityHelper.MD5($"admin{SecurityHelper.MD5("111111")}}admin"));
所有介面採用統一的返回格式,欄位如下:
引數名稱 | 引數型別 | 說明 |
---|---|---|
Success | bool | 是否成功 |
Status | int | 結果狀態,0-請求失敗 1-請求成功 2-登入失敗 3-引數異常 4-資料異常 |
Message | string | 返回的訊息 |
Data | object | 返回的資料 |
使用API建立任務的方式不支援上傳程式包,所以在任務需要啟動時要確保程式包已通過其他方式上傳,否則會啟動失敗。
http://yourip:30000/api/task/create
POST
application/x-www-form-urlencoded
引數名稱 | 引數型別 | 是否必填 | 說明 |
---|---|---|---|
MetaType | int | 是 | 任務型別,這裡固定是1 |
Title | string | 是 | 任務名稱 |
RunLoop | bool | 是 | 是否按週期執行 |
CronExpression | string | 否 | cron表示式,如果RunLoop為true則必填 |
AssemblyName | string | 是 | 程式集名稱 |
ClassName | string | 是 | 執行類名稱,包含完整名稱空間 |
StartDate | DateTime | 是 | 任務開始時間 |
EndDate | DateTime | 否 | 任務停止時間,為空表示不限停止時間 |
Remark | string | 否 | 任務描述說明 |
Keepers | List<int> | 否 | 監護人id |
Nexts | List<guid> | 否 | 子級任務id |
Executors | List<string> | 否 | 執行節點名稱 |
RunNow | bool | 否 | 建立成功是否立即啟動 |
Params | List<ScheduleParam> | 否 | 自定義參數列,也可以通過CustomParamsJson欄位直接傳json格式字串 |
ScheduleParam:
引數名稱 | 引數型別 | 是否必填 | 說明 |
---|---|---|---|
ParamKey | string | 是 | 引數名稱 |
ParamValue | string | 是 | 引數值 |
ParamRemark | string | 否 | 引數說明 |
HttpClient client = new HttpClient(); List<KeyValuePair<string, string>> args = new List<KeyValuePair<string, string>>(); args.Add(new KeyValuePair<string, string>("MetaType", "1")); args.Add(new KeyValuePair<string, string>("RunLoop", "true")); args.Add(new KeyValuePair<string, string>("CronExpression", "33 0/8 * * * ?")); args.Add(new KeyValuePair<string, string>("Remark", "By Xunit Tester Created")); args.Add(new KeyValuePair<string, string>("StartDate", DateTime.Today.ToString("yyyy-MM-dd HH:mm:ss"))); args.Add(new KeyValuePair<string, string>("Title", "程式集介面測試任務")); args.Add(new KeyValuePair<string, string>("AssemblyName", "Hos.ScheduleMaster.Demo")); args.Add(new KeyValuePair<string, string>("ClassName", "Hos.ScheduleMaster.Demo.Simple")); args.Add(new KeyValuePair<string, string>("CustomParamsJson", "[{"ParamKey":"k1","ParamValue":"1111","ParamRemark":"r1"},{"ParamKey":"k2","ParamValue":"2222","ParamRemark":"r2"}]")); args.Add(new KeyValuePair<string, string>("Keepers", "1")); args.Add(new KeyValuePair<string, string>("Keepers", "2")); //args.Add(new KeyValuePair<string, string>("Nexts", "")); //args.Add(new KeyValuePair<string, string>("Executors", "")); HttpContent reqContent = new FormUrlEncodedContent(args); var response = await client.PostAsync("http://localhost:30000/api/Task/Create", reqContent); var content = await response.Content.ReadAsStringAsync(); Debug.WriteLine(content);
http://yourip:30000/api/task/create
POST
application/x-www-form-urlencoded
引數名稱 | 引數型別 | 是否必填 | 說明 |
---|---|---|---|
MetaType | int | 是 | 任務型別,這裡固定是2 |
Title | string | 是 | 任務名稱 |
RunLoop | bool | 是 | 是否按週期執行 |
CronExpression | string | 否 | cron表示式,如果RunLoop為true則必填 |
StartDate | DateTime | 是 | 任務開始時間 |
EndDate | DateTime | 否 | 任務停止時間,為空表示不限停止時間 |
Remark | string | 否 | 任務描述說明 |
HttpRequestUrl | string | 是 | 請求地址 |
HttpMethod | string | 是 | 請求方式,僅支援GETPOSTPUTDELETE |
HttpContentType | string | 是 | 引數格式,僅支援application/json和application/x-www-form-urlencoded |
HttpHeaders | string | 否 | 自定義請求頭,ScheduleParam列表的json字串 |
HttpBody | string | 是 | 如果是json格式引數,則是對應引數的json字串;如果是form格式引數,則是對應ScheduleParam列表的json字串。 |
Keepers | List<int> | 否 | 監護人id |
Nexts | List<guid> | 否 | 子級任務id |
Executors | List<string> | 否 | 執行節點名稱 |
RunNow | bool | 否 | 建立成功是否立即啟動 |
HttpClient client = new HttpClient(); List<KeyValuePair<string, string>> args = new List<KeyValuePair<string, string>>(); args.Add(new KeyValuePair<string, string>("MetaType", "2")); args.Add(new KeyValuePair<string, string>("RunLoop", "true")); args.Add(new KeyValuePair<string, string>("CronExpression", "22 0/8 * * * ?")); args.Add(new KeyValuePair<string, string>("Remark", "By Xunit Tester Created")); args.Add(new KeyValuePair<string, string>("StartDate", DateTime.Today.ToString("yyyy-MM-dd HH:mm:ss"))); args.Add(new KeyValuePair<string, string>("Title", "Http介面測試任務")); args.Add(new KeyValuePair<string, string>("HttpRequestUrl", "http://localhost:56655/api/1.0/value/jsonpost")); args.Add(new KeyValuePair<string, string>("HttpMethod", "POST")); args.Add(new KeyValuePair<string, string>("HttpContentType", "application/json")); args.Add(new KeyValuePair<string, string>("HttpHeaders", "[]")); args.Add(new KeyValuePair<string, string>("HttpBody", "{ "Posts": [{ "PostId": 666, "Title": "tester", "Content":"testtesttest" }], "BlogId": 111, "Url":"qweqrrttryrtyrtrtrt" }")); HttpContent reqContent = new FormUrlEncodedContent(args); var response = await client.PostAsync("http://localhost:30000/api/Task/Create", reqContent); var content = await response.Content.ReadAsStringAsync(); Debug.WriteLine(content);
http://yourip:30000/api/delaytask/create
POST
application/x-www-form-urlencoded
引數名稱 | 引數型別 | 是否必填 | 說明 |
---|---|---|---|
SourceApp | string | 是 | 來源 |
Topic | string | 是 | 主題 |
ContentKey | string | 是 | 業務關鍵字 |
DelayTimeSpan | int | 是 | 延遲相對時間 |
DelayAbsoluteTime | DateTime | 是 | 延遲絕對時間 |
NotifyUrl | string | 是 | 回撥地址 |
NotifyDataType | string | 是 | 回撥引數格式,僅支援application/json和application/x-www-form-urlencoded |
NotifyBody | string | 是 | 回撥引數,json格式字串 |
for (int i = 0; i < 5; i++) { int rndNum = new Random().Next(20, 500); List<KeyValuePair<string, string>> args = new List<KeyValuePair<string, string>>(); args.Add(new KeyValuePair<string, string>("SourceApp", "TestApp")); args.Add(new KeyValuePair<string, string>("Topic", "TestApp.Trade.TimeoutCancel")); args.Add(new KeyValuePair<string, string>("ContentKey", i.ToString())); args.Add(new KeyValuePair<string, string>("DelayTimeSpan", rndNum.ToString())); args.Add(new KeyValuePair<string, string>("DelayAbsoluteTime", DateTime.Now.AddSeconds(rndNum).ToString("yyyy-MM-dd HH:mm:ss"))); args.Add(new KeyValuePair<string, string>("NotifyUrl", "http://localhost:56655/api/1.0/value/delaypost")); args.Add(new KeyValuePair<string, string>("NotifyDataType", "application/json")); args.Add(new KeyValuePair<string, string>("NotifyBody", "{ "Posts": [{ "PostId": 666, "Title": "tester", "Content":"testtesttest" }], "BlogId": 111, "Url":"qweqrrttryrtyrtrtrt" }")); HttpContent reqContent = new FormUrlEncodedContent(args); var response = await client.PostAsync("http://localhost:30000/api/DelayTask/Create", reqContent); var content = await response.Content.ReadAsStringAsync(); Debug.WriteLine(content); }
根據官網的設計圖,以及操作的流程,簡單總結一下任務全域性流程為使用者端—–>master——>work—–>執行任務。從大的架構方向的思想就是,將原有單個服務中業務和任務排程混合的方式做一些改變,使業務和排程分離,專門把任務排程部分剝離出來,作為一個獨立的程序,來統一呼叫和管理任務,而原有服務只做業務處理。
我們主要從主節點,從節點,資料表這幾個方面來簡單分析,整個業務的時序流程,從本質來看並不複雜master和Work之間的關係是相互配合的,可能乍一看下面整個圖有點混亂,下面來解釋一下,其實Master節點將任務新增到資料中,然後work節點,去從對應的資料表中取出任務資料,然後根據任務對應的設定,生成設定資訊,呼叫Quartz執行任務,這就是我們整個框架中最核心的業務。
當然master和work除了主要承載了整個管理系統的UI視覺化、後臺業務操作、任務執行之外,如果從細節以及實現方式來說主要做了以下事情:
Master
Work
到此這篇關於分散式任務排程ScheduleMaster的文章就介紹到這了,更多相關分散式任務排程ScheduleMaster內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45