首先來聊一聊什么是消息中間件,以及消息中間件能幫助我們解決什么問題。 消息中間件是基于隊列與消息傳遞技術(shù),在網(wǎng)絡(luò)環(huán)境中為應用系統(tǒng)提供同步或異步、可靠的消息傳輸?shù)闹涡攒浖到y(tǒng),簡單來說,消息中間件能夠為我們的系統(tǒng)提供異步處理能力。 舉個例子,某個系統(tǒng)在使用之前需要用戶進行注冊,用戶在完成注冊后需要發(fā)送短信和郵件提醒用戶注冊成功,如果按照同步的流程走,它應該是這樣的:
但這樣有一個問題,當用戶注冊成功后,我們需要等待系統(tǒng)發(fā)送完短信和郵件后再讓用戶執(zhí)行下一個流程嗎?其實是不需要的,用戶注冊成功后完全可以讓其直接進入下一個流程,而發(fā)送短信和發(fā)送郵件的操作可以進行異步處理:
將這兩個操作分為兩個異步任務(wù)去執(zhí)行,雖然提高了整體的執(zhí)行效率,但用戶仍然要等待兩個操作中耗時最長的那個操作結(jié)束,因此,我們可以引入消息中間件:
此時用戶只需要等待系統(tǒng)將消息放入消息中間件,至于發(fā)送短信和郵件,將由消息中間件自動完成,這樣將大大提高注冊的效率,提升用戶體驗。 消息中間件的功能遠不止如此,它還能夠?qū)崿F(xiàn)應用解耦,舉個例子,某電商系統(tǒng)在用戶提交了一份訂單后,訂單服務(wù)會調(diào)用庫存服務(wù)提供的接口進行減庫存的操作,如下所示:
那么這兩個服務(wù)就存在著耦合性,當庫存服務(wù)的接口發(fā)生了變化,則訂單服務(wù)就必須立馬修改代碼,否則程序都不能正常運行了,若想解決這個問題,就可以在服務(wù)中間加一個消息中間件,訂單服務(wù)只需將消息寫入中間件,并由庫存服務(wù)去訂閱這個消息即可,如下所示:
消息中間件還能夠用來實現(xiàn)流量控制,比如非常熟悉的秒殺業(yè)務(wù),當秒殺活動開始時的流量是非常巨大的,為了防止大量的請求直接壓垮系統(tǒng),可以將它們按順序?qū)懭胂㈥犃?,再由系統(tǒng)慢慢地去獲取請求進行處理:
什么是RabbitMQ?為什么使用RabbitMQ?
采用AMQP高級消息隊列協(xié)議的一種消息隊列技術(shù),大的特點就是消費并不需要確保提供方存在,實現(xiàn)了服務(wù)之間的高度解耦
可以用它來:解耦、異步、削峰。
為什么要使用rabbitmq?
在分布式系統(tǒng)下具備異步,削峰,負載均衡等一系列高級功能
擁有持久化的機制,進程消息,隊列中的信息也可以保存下來
實現(xiàn)消費者和生產(chǎn)者之間的解耦
對于高并發(fā)場景下,利用消息隊列可以使得同步訪問變?yōu)榇性L問達到一定量的限流,利于數(shù)據(jù)庫的操作
可以使用消息隊列達到異步下單的效果,排隊中,后臺進行邏輯下單
使用rabbitmq的場景
服務(wù)間異步通信
順序消費
定時任務(wù)
請求削峰
組件介紹
Broker:它提供一種傳輸服務(wù),它的角色就是維護一條從生產(chǎn)者到消費者的路線,保證數(shù)據(jù)能按照指定的方式進行傳輸,
Exchange:消息交換機,它指定消息按什么規(guī)則,路由到哪個隊列。
Queue:消息的載體,每個消息都會被投到一個或多個隊列。
Binding:綁定,它的作用就是把exchange和queue按照路由規(guī)則綁定起來.
Routing Key:路由關(guān)鍵字,exchange根據(jù)這個關(guān)鍵字進行消息投遞。
vhost:虛擬主機,一個broker里可以有多個vhost,用作不同用戶的權(quán)限分離。
Producer:消息生產(chǎn)者,就是投遞消息的程序.
Consumer:消息消費者,就是接受消息的程序.
Channel:消息通道,在客戶端的每個連接里,可建立多個channel.
消息發(fā)布和接收流程
如何發(fā)送消息
生產(chǎn)者和Broker建立TCP連接
生產(chǎn)者和Broker建立通道
生產(chǎn)者通過通道消息發(fā)送給Broker,由Exchange將消息進行轉(zhuǎn)發(fā)
Exchange將消息轉(zhuǎn)發(fā)到止跌那個的Queue(隊列)
如何接收消息
消費者和Broker建立TCP連接
消費者和Broker建立通道
消費者監(jiān)聽制定的Queue(隊列)
當有消息到達Queue時Broker默認將消息推送給消費者
消費者接受到消
七種模式介紹與應用場景
1.簡單模式
做最簡單的事情,一個生產(chǎn)者對應一個消費者,RabbitMQ相當于一個消息代理,負責將A的消息轉(zhuǎn)發(fā)給B 。
應用場景: 將發(fā)送的電子郵件放到消息隊列,然后郵件服務(wù)在隊列中獲取郵件并發(fā)送給收件人
2.工作隊列模式
在多個消費者之間分配任務(wù)(競爭的消費者模式),一個生產(chǎn)者對應多個消費者,一般適用于執(zhí)行資源密集型任務(wù),單個消費者處理不過來,需要多個消費者進行處理 應用場景: 一個訂單的處理需要10s,有多個訂單可以同時放到消息隊列,然后讓多個消費者同時處理,這樣就是并行了,而不是單個消費者的串行情況
3.訂閱模式
一次向許多消費者發(fā)送消息,一個生產(chǎn)者發(fā)送的消息會被多個消費者獲取,也就是將消息將廣播到所有的消費者中。
應用場景: 更新商品庫存后需要通知多個緩存和多個數(shù)據(jù)庫,這里的結(jié)構(gòu)應該是:
一個fanout類型交換機扇出兩個個消息隊列,分別為緩存消息隊列、數(shù)據(jù)庫消息隊列
一個緩存消息隊列對應著多個緩存消費者
一個數(shù)據(jù)庫消息隊列對應著多個數(shù)據(jù)庫消費者
4.路由模式
有選擇地(Routing key)接收消息,發(fā)送消息到交換機并且要指定路由key ,消費者將隊列綁定到交換機時需要指定路由key,僅消費指定路由key的消息
應用場景: 如在商品庫存中增加了1臺iphone12,iphone12促銷活動消費者指定routing key為iphone12,只有此促銷活動會接收到消息,其它促銷活動不關(guān)心也不會消費此routing key的消息
5.主題模式
根據(jù)主題(Topics)來接收消息,將路由key和某模式進行匹配,此時隊列需要綁定在一個模式上,#匹配一個詞或多個詞,*只匹配一個詞。
應用場景: 同上,iphone促銷活動可以接收主題為iphone的消息,如iphone12、iphone13等
6.遠程過程調(diào)用
如果我們需要在遠程計算機上運行功能并等待結(jié)果就可以使用RPC,具體流程可以看圖。應用場景:需要等待接口返回數(shù)據(jù),如訂單支付 7.發(fā)布者確認
與發(fā)布者進行可靠的發(fā)布確認,發(fā)布者確認是RabbitMQ擴展,可以實現(xiàn)可靠的發(fā)布。在通道上啟用發(fā)布者確認后,RabbitMQ將異步確認發(fā)送者發(fā)布的消息,這意味著它們已在服務(wù)器端處理。(搜索公眾號Java知音,回復“2021”,送你一份Java面試題寶典)
應用場景: 對于消息可靠性要求較高,比如錢包扣款
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧
當前題目:初識RabbitMQ-創(chuàng)新互聯(lián)
本文網(wǎng)址:http://chinadenli.net/article32/dgpipc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制網(wǎng)站、定制開發(fā)、做網(wǎng)站、服務(wù)器托管、App開發(fā)、網(wǎng)站維護
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容