.NET Core下的開源分布式任務調度平台ScheduleMaster-我的首個開源項目


從何說起

2017年初的時候,由於當時項目需要做了一個乞丐版定時調度系統,那時候只在單機上實現了核心的調度功能。做這個玩意之前也調研了社區中開源的解決方案,找了幾個實地部署試跑了一下,其實都很不錯。但那時候我們有個問題就是應用都是基於Azure WebApp去部署,不太想為了這個東西搞一台虛擬機來跑windows服務,所以最后決定重新開發一個,哪怕功能簡單點能滿足需要就行。

很快這個東西就做好了也投入了使用,因為是給業務系統定制那里面多少摻雜一些業務上的東西,那時候我就有了一個想法:把它剝離處理做成一個比較通用的系統打造成自己的開源項目。后來又對它做了一些升級優化,支持了多節點運行,做了一些界面展示。

雖然那時候.Net Core已經出了正式版,但由於之前的業務系統還是使用.Net Framework開發,調度系統也並沒有選擇.Net Core。

再后來,我就定了計划路線:一個單機版和一個集群版,單機版主要是部署簡單但是可用性比較低,集群版支持多節點部署可以保障高可用。於是說干就干,在工作之余慢慢添磚加瓦,找UI搭架子,一行行代碼開始堆起來,又一遍遍重構(萬事開頭難)。到年底的時候因為一些原因換工作了,接着整個18年都比較(忙)懶,基本處於停滯狀態沒什么產出。一直到2019下半年,才下決心出一個版本。這時候恰好碰上.Net Core 3.0發布,決定用Core重構一遍,也順便對.Net Core來一次實戰,於是就有了現在這個版本。

持續近4年的Flag終於有了第一個Milestone。

傳送門:https://github.com/hey-hoho/ScheduleMasterCore

還有一個原因選擇在3.0時重構,Framework中使用了AppDomain機制來實現程序集動態管理,.Net Core之前的版本沒有類似這種功能,直到3.0版本才有了AssemblyLoadContext提供這個能力。


關於包裝


當時想把這個項目搞的稍微(有逼格)正式一點,讓它看起來不那么山寨,認認真真想了一個名字最后定為ScheduleMaster(可譯為調度大師)。然后又去網上偷了一個icon(來自@ColinXu 的作品,在此感謝),用我撇腳的PS功底搗騰幾下做了logo,也算是正式出道了。后來上GitHub創建了Repository,更新了Description和ReadMe,添加了License,綁定了Azure DevOps,讓一切看起來都像個正兒八經的開源項目。


主要功能

  • 簡易的Web UI操作;
  • 任務動態管理:創建、啟動、停止、暫停、恢復、刪除等;
  • 高可用支持,跨平台多節點部署;
  • 數據安全性,不會出現多實例並發調度;
  • 支持自定義參數設置;
  • 支持設置監護人,運行異常時郵件告警;
  • 支持設置任務依賴,自動觸發,共享任務結果;
  • 插件式開發,任務運行環境隔離;
  • 全鏈路日志系統,運行軌跡輕松掌控;
  • 用戶訪問控制;
  • 提供開放REST API,業務系統可以無縫集成;
  • 調度報表統計;

關於功能我想說的是,我一直提倡專業的工具干專業的活,調度器就核心就是做調度,應該避免太多的業務操作,能夠通過遠程調用(RPC)實現的業務就不要把一堆dll丟到調度器里去跑。

除此之外,這套框架用來搭建中小型的web系統也是非常合適的。


主要技術

Asp.Net Core 3.0、原生DI、EntityFramework Core 3.0、Mysql 5.7、Quartz.Net、BeyondAdmin、Jquery一把梭...

沒有任何高大上的玩意,盡顯(低調奢華有內涵)朴實~

在這次重構過程中現學現賣,寫了下面2篇文章:

以后再慢慢寫文章來介紹其他的東西。


結構圖

為了讓整體架構有個清晰的展示,特意畫了下面這個圖,可以看到也是非常簡單:

雖然很簡單,但在我接觸過Kubernetes后驚人地發現兩者還挺相似,盡管Kubernetes要比我這個復雜的多。強行抱大腿😂😂


如何使用

在GitHub項目主頁readme中做了簡單描述,部署上基本沒啥難度,更詳細的我后面再補文檔。

怎么接入業務可以參考源碼中的Demo項目,這里簡單描述下。

  • 添加引用
    方式1,自行下載源碼編譯,手動添加引用Hos.ScheduleMaster.Base.dll
    方式2,通過Nuget搜索ScheduleMaster安裝。

  • 編寫業務代碼,並編譯成dll。

    public class MyTask : Hos.ScheduleMaster.Base.TaskBase
    {
        public override void Run(TaskContext context)
        {
            context.WriteLog($"當前時間是:{DateTime.Now}");
        }
    }
  • 上控制台創建一個任務,填寫好各項參數,dll打包上傳,再啟動任務即可。

劇照圖

先就這么多~


未來展望

還是先立下Flag:基於.Net Core的這是一個核心版本,后面會一直更新下去,今后的開發計划也在主頁readme做了描述。至於Framework上的版本,后面再說吧,如果當前這個石頭扔下去能激起一些水花,其他版本也一並完善起來。畢竟俗務纏身,也並非什么技術大佬編程極客,需要時間去干別的事。

當然了,有bug和優化點大家隨時砸過來:

https://github.com/hey-hoho/ScheduleMasterCore/issues

有問題可以加QQ群交流:824535095

雖然不再迷戀微軟,但還是希望.net社區越來越好,盡微薄之力多參與多貢獻,沖鴨~



免責聲明!

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



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