1. 程式人生 > >ScheduleMaster新特性之延時任務初體驗

ScheduleMaster新特性之延時任務初體驗

ScheduleMaster在上個月底更新到了2.0版本,在功能和程式碼以及文件上都往前跨了很大一步,詳細資訊可以參考這篇文章:https://www.cnblogs.com/hohoa/p/12772945.html 對ScheduleMaster還不熟悉的朋友可以先移步作者的系列文章:https://www.cnblogs.com/hohoa/category/1628282.html 這次的更新點主要包含: - 開發了延時任務功能。 - 抽象出分散式鎖服務並預設資料庫實現。 - 補充了單元測試。 - 補充了幾篇文件。 - 修復了已知的bug。 其中的重頭戲自然是延時任務功能,所謂的延時任務就是在指定時刻執行指定邏輯,這在平時需求開發中是非常常見的,作為一款功能齊全的排程系統這當然也是必備的功能。 關於延時任務的實現原理我早期寫過一篇文章[《採用簡易的環形延時佇列處理秒級定時任務的解決方案》](https://www.cnblogs.com/hohoa/p/7739271.html)來介紹,ScheduleMaster也是在這個基礎上改進而來。 當然了,其他的實現方式也還有很多,主流的實現方案可以參考下面這篇文章,整理的比較齊全:https://www.cnblogs.com/vipstone/p/12696465.html 我採用的就是比較經典的時間輪演算法,原理就不再重複介紹了可以移步到我前面的文章,下面看看實現效果。
### 實現了什麼效果 我們先通過一段測試程式碼看看延時佇列的執行情況: ```c# [Fact] public void Run() { //初始化容器 DelayPlanManager.Init(); Debug.WriteLine($"延時佇列初始化完成時間:{DateTime.Now}"); Func callback = (result) => { var np = result as NotifyPlan; //模擬業務 Debug.WriteLine($"[{DateTime.Now}]ID:{np.Key},地址:{np.NotifyUrl},延遲秒數:{np.TimeSpan}"); return Task.CompletedTask; }; //模擬生產端寫入任務 Task[] tasks = new Task[10]; for (int i = 0; i < 10; i++) { tasks[i] = new Task(() => { for (int k = 0; k < 200; k++) { int rndNum = new Random().Next(20, 500); DelayPlanManager.Insert(new NotifyPlan { NotifyUrl = "http://localhost:56655/api/1.0/value/delaypost", Key = Guid.NewGuid().ToString(), Callback = callback }, DateTime.Now.AddSeconds(rndNum)); } }, TaskCreationOptions.LongRunning); tasks[i].Start(); } Task.WaitAll(tasks); //構造消費者 while (true) { DelayPlanManager.Read(); System.Threading.Thread.Sleep(1000); } } ``` 程式碼中建立了2000個延時任務,延時範圍在20秒至500秒,所以我們預測在程式啟動後最快20秒就開始有資訊輸出,程式調式結果為: ![ ](https://imgkr.cn-bj.ufileos.com/57e87f64-ce80-4779-a111-d09235254a2d.png) 當一個週期執行完後剛好過了1分鐘: ![ ](https://imgkr.cn-bj.ufileos.com/53995156-c248-49f0-b2f2-2423f18be843.png) 分秒不差。
### 先睹為快 再看看在專案中的實際應用。 控制檯建立任務頁面: ![ ](https://imgkr.cn-bj.ufileos.com/80abe245-e70b-42bf-bce9-a8ec1ff94429.png) 不過實際使用中通過API方式建立顯然更符合需求,所以一如既往地提供了開放API供業務系統接入,詳細使用方式參考官方文件【[使用API接入任務](https://github.com/hey-hoho/ScheduleMasterCore/blob/master/docs/2-%E4%BD%BF%E7%94%A8API%E6%8E%A5%E5%85%A5%E4%BB%BB%E5%8A%A1.md)】。 系統提供了2種延遲模式供選擇,即**相對時間**或**絕對時間**,可以在系統引數中配置,**預設是使用相對時間**。但使用相對時間模式有一點要注意,各節點間可能存在系統時間差導致任務被多次執行,所以業務做好冪等性控制至關重要。 延時任務管理頁面: ![ ](https://imgkr.cn-bj.ufileos.com/25cb58a4-b36f-417f-baf9-e0942addbfbd.png) ![ ](https://imgkr.cn-bj.ufileos.com/efa68936-246b-41e9-9d94-56345430b02f.png) 這裡解釋下任務的各個狀態 - 已作廢,表示已經從執行計劃移除 - 已建立,表示剛建立好還沒有加入執行計劃 - 已就緒,表示已加入到執行計劃中等待執行 - 已完成,表示執行成功 - 異常,表示執行失敗 繼續看一下任務執行情況。 單節點執行成功: ![ ](https://imgkr.cn-bj.ufileos.com/d4083543-9381-4ae6-8af1-a49b70bc792a.png) 異常重試效果: ![ ](https://imgkr.cn-bj.ufileos.com/78738b1c-60c0-407a-9b62-157f641edf29.png) 可用的引數配置: ![ ](https://imgkr.cn-bj.ufileos.com/25b32501-71ce-47a0-81cf-0bc145ffcb4c.png) 更多好玩的東西歡迎下載體驗~
### 寫在最後 喜歡的朋友請來一波star支援,並持續關注~~ 傳送門: - https://github.com/hey-hoho/ScheduleMasterCore - https://gitee.com/hey-hoho/ScheduleMasterCore (只從github