nuget伺服器搭建
『壹』 厲害!一文了解消息中間件-RabbitMQ
RabbitMQ是2007年發布,是一個在AMQP(高級消息隊列協議)基礎上完成的,簡稱MQ全稱為Message Queue, 消息隊列(MQ)是一種應用程序對應用程序的通信方法,由Erlang(專門針對於大數據高並發的語言)語言開發,可復用的企業消息系統,是當前最主流的消息中間件之一,具有可靠性、靈活的路由、消息集群簡單、隊列高可用、多種協議的支持、管理界面、跟蹤機制以及插件機制。
1.消息 就是數據,增刪改查的數據。例如在員工管理系統中增刪改查的數據
2.隊列 指的是一端進數據一端出數據,例如C#中(Queue數據結構)
1.消息隊列指:一端進消息,一端出消息
2.RabbitMQ就是實現了消息隊列概念的一個組件,以面向對象的思想去理解,消息隊列就是類,而RabbitMQ就是實例,當然不僅僅只有RabbitMQ,例如ActiveMQ,RocketMQ,Kafka,包括Redis也可以實現消息隊列。
1.在常見的單體架構中,主要流程是用戶UI操作發起Http請求>伺服器處理>然後由伺服器直接和資料庫交互,最後同步反饋用戶結果
2.在微服務架構中,UI與微服務通信,主要是通過Http或者gRPC同步通信
問題分析
在上述2種情況下,我們發現在UI請求時都是同步操作 ,第2種架構雖然將整體服務按業務拆分成不同的微服務並且對應各自的資料庫,但是在用戶與微服務通信時,存在的問題依然沒有解決,例如資料庫的承載能力只能處理10w個請求,如果遇到高並發情況下,UI發起50w請求,那資料庫是遠遠承載不了的,從而導致如下問題。
1.高並發請求導致系統性能下降響應慢,同時資料庫承載風險加大
2.擴展性不強UI操作的交互對業務的依賴較大,導致用戶體驗下降
3.瞬時流量湧入巨大的話,伺服器可能直接掛了
解決方案
RabbitMQ的優勢
RabbitMQ的不足
1.ConnectionFactory 為Connection的製造工廠。
2.Connection是RabbitMQ的socket鏈接,它封裝了socket協議相關部分邏輯。
3.Channel是我們與RabbitMQ打交道的最重要的一個介面,我們大部分的業務操作是在Channel這個介面中完成的,包括定義Queue、定義Exchange、綁定Queue與Exchange、發布消息等。
4.Exchange(交換機) 我們通常認為生產者將消息投遞到Queue中,實際上實際的情況是,生產者將消息發送到Exchange,由Exchange將消息路由到一個或多個Queue中(或者丟棄),而在RabbitMQ中的Exchange一共有4種策略,分別為:fanout(扇形)、direct(直連)、topic(主題)、headers(頭部)
1.下載RabbitMQ
2.運行環境erlang
3.安裝完成之後,載入RabbitMQ管理插件
4.安裝成功訪問RabbitMQ管理後台http://localhost:15672
1.分別創建考勤服務,請假服務,計算薪酬服務,郵件服務,簡訊服務消費者角色
2.創建員工管理網站用於模擬前端調用,主要充當生產者角色
3.在員工管理網站和每一個模擬微服務中通過nuget引入RabbitMQ.Client
4.在員工管理網站中創建模擬添加考勤的控制器並加入生產者代碼
5.在考勤微服務中創建介面,並在介面中加入消費者代碼
fanout類型的Exchange路由規則非常簡單,工作方式類似於多播一對多,它會把所有發送到該Exchange的消息路由到所有與它綁定的Queue中。
業務實例
當我們有員工需要請假,在員工管理系統提交請假,但是由於公司規定普通員工請假,需要發送簡訊到他的主管領導,針對此業務場景我們需要調用請假服務的同時去發送簡訊,這時需要兩個消費者(請假服務,簡訊服務)來消費同一條消息,其實本質就是往RabbitMQ寫入一個能被多個消費者接收的消息,所以可以使用 扇形交換機,一個生產者,多個消費者.
生產者模擬使用調用控制器來實現
消費者實現IHostedService 介面創建一個監聽主機
直接交換器,工作方式類似於單播一對一,Exchange會將消息發送完全匹配ROUTING_KEY的Queue,缺陷是無法實現多生產者對一個消費者
當我們員工管理系統需要計算薪資並將結果以發送簡訊的方式告訴員工,這個時候我們就不太適合用「扇形交換機」了,因為換做是你,你也不想你的工資全公司都知道吧?這個時候就需要定製了一對一的場景了,那就在生產消息時使用直連交換機根據routingKey發送指定的消費者.
生產者模擬使用調用控制器來實現
消費者實現IHostedService 介面創建一個監聽主機
Exchange綁定隊列需要制定Key; Key 可以有自己的規則;Key可以有佔位符; 或者# , 匹配一個單詞、#匹配多個單詞,在Direct基礎上加上模糊匹配;多生產者一個消費者,可以多對對,也可以多對1, 真實項目當中,使用主題交換機。可以滿足所有場景
1.生產者定義Exchange,然後不同的routingKey綁定
3.消費者routingKey的模糊匹配,生產者發送消息時routingKey定義以sms.開頭, * 號只能匹配的routingKey為一級,例如(sms.A)或(sms.B)的發送的消息,# 能夠匹配的routingKey為一級及多級以上 ,例如 (sms.A)或者(sms.A.QWE.IOP)
在月底的時候我們需要把員工存在異常考勤信息,薪資結算信息,請假信息分別以郵件的形式發送給我們的員工查閱,我們知道這是一個典型的多個生產者,一個消費者場景,異常考勤信息,薪資結算信息,請假信息分別需要生產消息發送到RabbitMQ,然後供我們員工消費
分別模擬3個生產者:異常考勤信息,薪資結算信息,請假信息
headers類型的Exchange不依賴於routing key與binding key的匹配規則來路由消息,而是根據發送的消息內容中的headers屬性進行匹配。
在綁定Queue與Exchange時指定一組鍵值對以及x-match參數,x-match參數是字元串類型,可以設置為any或者all。如果設置為any,意思就是只要匹配到了headers表中的任何一對鍵值即可,all則代表需要全部匹配。
1.不需要依賴Key
2.更多的時候,像這種Key Value 的鍵值,可能會存儲在資料庫中,那麼我們就可以定義一個動態規則來拼裝這個Key value ,從而達到消息靈活轉發到不同的隊列中去
我們根據上面的業務和代碼簡單實現了由生產者到消費者的一個業務流程,我們可以總結出知道,整個消息的收發過程包含有三個角色,生產者(員工管理網站)、RabbitMQ(Broker)、消費者(微服務),在理想狀態下,按照這樣實現,整個流程以及系統的穩定性,可能不會發生太大的問題,但是真正在實際應用中我們要去思考可能存在的問題,主要從三個大的方面去分析,然後發散。
1.生產端
2.存儲端
3.消費端
我們在給RabbitMQ發送消息時,如何去保證消息一定到達呢,我們可以使用RabbitMQ提供了2種生產端的消息確認機制
我們生產端給RabbitMQ發送消息成功後,如果RabbitMQ宕機了,會導致RabbitMQ中消息丟失,如何解決消息丟失問題,針對RabbitMQ消息丟失,我們可以在生產者中使用
1.持久化消息
2.集群
當生產者寫入消息到RabbitMQ後,消費服務接收消息期間,伺服器宕機,導致消息丟失了,這個時候我們就應該使用RabbitMQ的消費端消息確認機制
1.自動確認
2.手動確認
消費者收到消息。消費者發送確認消息給rabbitmq期間。執行業務邏輯失敗了,但是消息已經確認被消費了,我們應該在我們的消費者接收消息回調執行業務邏輯後面,執行使用手動確認消息機制,保證消息不被丟失
原文鏈接:https://www.cnblogs.com/yuxl01/p/15978229.html