一.系統(tǒng)描述
嗨,好久不見各位老哥,最近有點(diǎn)懶,技術(shù)博客寫的太少了,因?yàn)樽罱趯懶≌f(shuō),寫的順利的話說(shuō)不定就轉(zhuǎn)行了,哈哈哈哈哈哈哈哈哈。
今天要介紹的是基于.Net Core的定時(shí)任務(wù)調(diào)度和消息隊(duì)列管理系統(tǒng)。相信大家對(duì)這兩個(gè)肯定都已經(jīng)很熟悉了,在開發(fā)過(guò)程中,這兩個(gè)組件扮演了不可或缺的角色:
消息隊(duì)列幫助我們進(jìn)行 ”解耦“、”異步“、”削峰“
定時(shí)任務(wù)幫助我們進(jìn)行 "后臺(tái)"、”監(jiān)控"、“補(bǔ)償"
定時(shí)任務(wù)調(diào)度系統(tǒng)大家都介紹過(guò)很多次了,園子里的很多文章我也都拜讀過(guò),我相信大家實(shí)際的工作中肯定也都在頻繁的使用它。目前主流的組件有
Quartz和Hangfire兩種,在兩者的選擇上來(lái)說(shuō)建議大家熟悉哪個(gè)用哪個(gè)就可以,Hangfire是自帶UI管理界面的,所以如果想直接接入系統(tǒng)并且不想再進(jìn)行二次開發(fā)做UI,可以直接選擇Hangfire。
因?yàn)槲覍?duì)于Quartz更熟悉,所以本系統(tǒng)的定時(shí)任務(wù)調(diào)度基于Quartz開發(fā),消息隊(duì)列基于RabbitMQ,同時(shí)有一套UI,用于可視化操作定時(shí)任務(wù)調(diào)度和管理消息隊(duì)列配置。
本系統(tǒng)是開發(fā)自用的,原型是公司工作中使用的系統(tǒng),私下里重寫了一套后臺(tái)代碼,但是UI還是公司的那一套,因?yàn)槭亲杂?,所以無(wú)法達(dá)到直接開箱即用的效果,寫這篇的目的只是希望分享兩者的使用方式和場(chǎng)景,幫助各位在遇到相同應(yīng)用場(chǎng)景的問(wèn)題時(shí)能夠有更多解決思路。
?
二.功能介紹
1.MQ界面化動(dòng)態(tài)配置,對(duì)代碼幾乎無(wú)入侵。(當(dāng)然你還是需要引用nuget用來(lái)Publish消息的)
2.提供定時(shí)任務(wù)調(diào)度功能。(基于Quartz,可以精確到秒,執(zhí)行方式包括接口、sql腳本、elk)
3.基于數(shù)據(jù)庫(kù)腳本的異常數(shù)據(jù)監(jiān)控。(通過(guò)定時(shí)任務(wù)調(diào)度系統(tǒng)執(zhí)行監(jiān)控的sql腳本)
3.自動(dòng)補(bǔ)償。(當(dāng)異常數(shù)據(jù)通過(guò)sql腳本監(jiān)控出來(lái)后,發(fā)送MQ到指定消費(fèi)接口進(jìn)行數(shù)據(jù)處理)
?
三、系統(tǒng)架構(gòu)介紹
整個(gè)系統(tǒng)包括六部分:
1. MI.MessageQueue:消息隊(duì)列基礎(chǔ)組件,就是我們用來(lái)操作RabbitMQ的一系列方法。
2.MI.MQStationServer:消息隊(duì)列管理服務(wù),提供包括消息隊(duì)列的增刪改查接口,消費(fèi)MQ消息。
3.MI.Service.Blade:定時(shí)任務(wù)調(diào)度管理服務(wù),提供定時(shí)任務(wù)相關(guān)的一系列操作接口。
4.MI.Biz.MQStation:消息隊(duì)列windows服務(wù),用于消費(fèi)MQ,主要是建立相關(guān)的消息消費(fèi)者,并轉(zhuǎn)發(fā)消息到消息隊(duì)列管理服務(wù)。
5.MI.Biz.Blade:定時(shí)任務(wù)windows服務(wù),用于創(chuàng)建及轉(zhuǎn)發(fā)相應(yīng)的任務(wù),真正的執(zhí)行在MI.Service.Blade服務(wù)。
6.MI.Monitor.Web:UI管理界面,以上兩者所有的增刪改查都在這里。
?
以下是定時(shí)任務(wù)調(diào)度系統(tǒng)間的交互:
?
?
?
簡(jiǎn)單描述一下,用戶在MI.Monitor.Web系統(tǒng)中通過(guò)界面化的操作創(chuàng)建定時(shí)任務(wù),其會(huì)調(diào)用API接口也就是MI.Service.Blade服務(wù),將操作的數(shù)據(jù)寫入數(shù)據(jù)庫(kù),對(duì)于增刪改,數(shù)據(jù)庫(kù)寫入完成后會(huì)發(fā)送一條MQ消息,Windows服務(wù)MI.Biz.Blade收到MQ消息后,根據(jù)消息中的數(shù)據(jù)添加或更改Quartz配置信息,對(duì)于定時(shí)任務(wù)Quartz完全基于代碼動(dòng)態(tài)化創(chuàng)建和刪除。這樣交互的好處一方面是解耦,這個(gè)比較明顯,這里解耦帶來(lái)的一個(gè)好處是異常隔離,本身三者之間的分工不同,對(duì)于發(fā)生問(wèn)題的一方只在內(nèi)部消化;第二點(diǎn)好處是方便橫向擴(kuò)展,無(wú)論是Windows服務(wù)還是API都可以根據(jù)自身的負(fù)載動(dòng)態(tài)加減機(jī)器。當(dāng)然,對(duì)于WIndows服務(wù)我們要做集群,通過(guò)Zookeeper可以實(shí)現(xiàn),防止單點(diǎn)故障。
?
以下是消息隊(duì)列系統(tǒng)的交互:
?
?
?看起來(lái)和上面的定時(shí)任務(wù)調(diào)度交互好像差不多,不過(guò)這個(gè)地方的麻煩點(diǎn)其實(shí)在于基礎(chǔ)組件的編寫,就是MI.MessageQueue里面的一系列RabbitMQ操作,目前支持單消息、批量消息、延時(shí)消息,延時(shí)消費(fèi)需要借助RabbitMQ官方提供的
”rabbitmq_delayed_message_exchange“插件,有需要的話可以去了解以下,官方的API支持該操作。
還是照例描述一下消息隊(duì)列的數(shù)據(jù)交互流程,用戶在MI.Monitor.Web系統(tǒng)中通過(guò)界面化的操作創(chuàng)建或者更新消息隊(duì)列,其會(huì)調(diào)用API接口也就是MI.MQStationServer服務(wù),將操作的數(shù)據(jù)寫入數(shù)據(jù)庫(kù),寫入完成后會(huì)創(chuàng)建交換器(Exchange),然后發(fā)送MQ消息,Windows服務(wù)MI.Biz.MQStation收到消息后,將隊(duì)列和RouteKey綁定到對(duì)應(yīng)的交換器,同時(shí)創(chuàng)建消費(fèi)者,綁定監(jiān)聽回調(diào),該回調(diào)只是當(dāng)作一個(gè)轉(zhuǎn)發(fā),收到消息后會(huì)通過(guò)接口將數(shù)據(jù)發(fā)送到MI.MQStationServer服務(wù),根據(jù)在UI中配置的RouteKey和要消費(fèi)的接口進(jìn)行消費(fèi)處理。
?
消息隊(duì)列這樣設(shè)計(jì)的好處之一是解耦,同時(shí)異常隔離,這個(gè)就不說(shuō)了,大家都明白;當(dāng)然最重要的好處就是可以動(dòng)態(tài)擴(kuò)展,消費(fèi)壓力大,多啟動(dòng)幾個(gè)windows服務(wù)和API服務(wù),就是多加些消費(fèi)者,這個(gè)理解起來(lái)也比較簡(jiǎn)單。
?
?
四、優(yōu)化和展示
對(duì)于消息隊(duì)列系統(tǒng)目前還在開發(fā)中的功能是消息的數(shù)量統(tǒng)計(jì),該系統(tǒng)是支持查看每個(gè)隊(duì)列未消費(fèi)的消息量,但是還沒(méi)開發(fā)完成,這邊博文會(huì)一直更新的。
下面是系統(tǒng)的部分界面:
?
?
?
?
?
?
定時(shí)任務(wù)界面:
?
?
?
?
?
熱門工具 換一換
