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


ScheduleMaster在上個月底更新到了2.0版本,在功能和代碼以及文檔上都往前跨了很大一步,詳細信息可以參考這篇文章:https://www.cnblogs.com/hohoa/p/12772945.html

對ScheduleMaster還不熟悉的朋友可以先移步作者的系列文章:https://www.cnblogs.com/hohoa/category/1628282.html

這次的更新點主要包含:

  • 開發了延時任務功能。

  • 抽象出分布式鎖服務並默認數據庫實現。

  • 補充了單元測試。

  • 補充了幾篇文檔。

  • 修復了已知的bug。

其中的重頭戲自然是延時任務功能,所謂的延時任務就是在指定時刻執行指定邏輯,這在平時需求開發中是非常常見的,作為一款功能齊全的調度系統這當然也是必備的功能。

關於延時任務的實現原理我早期寫過一篇文章《采用簡易的環形延時隊列處理秒級定時任務的解決方案》來介紹,ScheduleMaster也是在這個基礎上改進而來。

當然了,其他的實現方式也還有很多,主流的實現方案可以參考下面這篇文章,整理的比較齊全:https://www.cnblogs.com/vipstone/p/12696465.html

我采用的就是比較經典的時間輪算法,原理就不再重復介紹了可以移步到我前面的文章,下面看看實現效果。


實現了什么效果

我們先通過一段測試代碼看看延時隊列的運行情況:

 [Fact]
 public void Run()
 {
     //初始化容器
     DelayPlanManager.Init();
     Debug.WriteLine($"延時隊列初始化完成時間:{DateTime.Now}");

     Func<DelayQueueSlot, Task> 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秒就開始有信息輸出,程序調式結果為:

當一個周期執行完后剛好過了1分鍾:

分秒不差。


先睹為快

再看看在項目中的實際應用。

控制台創建任務頁面:

不過實際使用中通過API方式創建顯然更符合需求,所以一如既往地提供了開放API供業務系統接入,詳細使用方式參考官方文檔【使用API接入任務】。

系統提供了2種延遲模式供選擇,即相對時間絕對時間,可以在系統參數中配置,默認是使用相對時間。但使用相對時間模式有一點要注意,各節點間可能存在系統時間差導致任務被多次執行,所以業務做好冪等性控制至關重要。

延時任務管理頁面:

這里解釋下任務的各個狀態

  • 已作廢,表示已經從執行計划移除

  • 已創建,表示剛創建好還沒有加入執行計划

  • 已就緒,表示已加入到執行計划中等待執行

  • 已完成,表示執行成功

  • 異常,表示執行失敗

繼續看一下任務運行情況。

單節點執行成功:

異常重試效果:

可用的參數配置:

更多好玩的東西歡迎下載體驗~


寫在最后

喜歡的朋友請來一波star支持,並持續關注~~

傳送門:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM