1. 程式人生 > >Asp.Net Core下的開源任務排程平臺ScheduleMaster

Asp.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篇文章:

  • 從EFCore上下文的使用到深入剖析DI的生命週期最後實現自動屬性注入
  • 在Asp.Net Core中使用ModelConvention實現全域性過濾器隔離

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


結構圖

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

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