大家好,我是卷心菜。如果您看完這篇文章有所收獲,可以三連支持博主哦~,嘻嘻。
??作者簡介:在校大學(xué)生一枚,Java領(lǐng)域新星創(chuàng)作者,Java、Python正在學(xué)習(xí)中,期待和大家一起學(xué)習(xí)一起進步~
??個人主頁:我是一棵卷心菜的個人主頁
??本文專欄:RabbitMQ學(xué)習(xí)
??自我提醒:多學(xué)多練多思考,編程能力才能節(jié)節(jié)高!
一、MQ的基本概念
MQ全稱 Message Queue(消息隊列),是在消息的傳輸過程中保存消息的容器,其本質(zhì)是個隊列。多用于分布式系統(tǒng)之間進行通信。其中,發(fā)送數(shù)據(jù)的一方稱為生產(chǎn)者;接收數(shù)據(jù)的一方稱為消費者。
二、MQ的優(yōu)勢
1、應(yīng)用解耦
- 以電商應(yīng)用為例,應(yīng)用中有訂單系統(tǒng)、庫存系統(tǒng)、物流系統(tǒng)、支付系統(tǒng)。當用戶創(chuàng)建訂單后,如果耦合調(diào)用庫存系統(tǒng)、物流系統(tǒng)、支付系統(tǒng),任何一個子系統(tǒng)出現(xiàn)了故障,都會造成下單操作異常。
- 當轉(zhuǎn)變?yōu)橄㈥犃械姆绞胶?,系統(tǒng)間調(diào)用的問題會減少很多,比如庫存系統(tǒng)因為發(fā)生故障,需要幾分鐘來修復(fù)。但并不會影響我們正常下單,因為下單后,可以把訂單系統(tǒng)寫入消息隊列,就不用擔心其它的后續(xù)操作了,實現(xiàn)了解耦。
2、異步處理
- 以用戶注冊后,需要發(fā)注冊郵件和注冊短信為例,使用傳統(tǒng)方式時,我們會將注冊信息寫入數(shù)據(jù)庫成功后,發(fā)送注冊郵件同時發(fā)送注冊短信。當這些任務(wù)完成后,返回給客戶端。
- 當我們使用消息隊列,可以將不是必須的業(yè)務(wù)邏輯,進行異步處理。用戶的響應(yīng)時間相當于是注冊信息寫入數(shù)據(jù)庫的時間,注冊郵件、發(fā)送短信寫入消息隊列后,直接返回,因此用戶的響應(yīng)時間非常的快。
3、流量削峰
- 以訂單系統(tǒng)為例,如果訂單系統(tǒng)在正常時段最多可以處理一萬次訂單,但到了雙十一,有兩萬次下單操作,這時訂單系統(tǒng)就會崩掉。因此可以使用消息隊列做緩沖,我們可以把一秒內(nèi)下的訂單分散成一段時間來處理,這時有些用戶可能在下單十幾秒后才能收到下單成功的操作,但總比不能下單的體驗感好!
三、MQ的分類
- 目前有很多MQ的產(chǎn)品,例如RabbitMQ、RocketMQ、ActiveMQ、Kafka、ZeroMQ等,也可以使用Redis充當消息隊列,而這些消息隊列產(chǎn)品,各有側(cè)重,在實際選型時,需要結(jié)合自身需求及MQ產(chǎn)品特征,綜合考慮。
四、RabbitMQ簡介
RabbitMQ是一個消息中間件,采用Erlang語言開發(fā)。它接受并轉(zhuǎn)發(fā)消息。你可以把它當做一個快遞站點,當你要發(fā)送一個包裹時,你把你的包裹放到快遞站,快遞員最終會把你的快遞送到收件人那里。RabbitMQ 與快遞站的主要區(qū)別在于,它不處理快件而是接收,存儲和轉(zhuǎn)發(fā)消息數(shù)據(jù)。
- RabbitMQ基礎(chǔ)架構(gòu)如圖:
五、四大核心概念
- 生產(chǎn)者:產(chǎn)生數(shù)據(jù)發(fā)送消息的程序是生產(chǎn)者
- 交換機:交換機是 RabbitMQ 非常重要的一個部件,一方面它接收來自生產(chǎn)者的消息,另一方面它將消息推送到隊列中。交換機必須確切知道如何處理它接收到的消息,是將這些消息推送到特定隊列還是推送到多個隊列,亦或者是把消息丟棄,這個得有交換機類型決定
- 隊列:隊列是 RabbitMQ 內(nèi)部使用的一種數(shù)據(jù)結(jié)構(gòu),盡管消息流經(jīng)RabbitMQ 和應(yīng)用程序,但它們只能存儲在隊列中。隊列僅受主機的內(nèi)存和磁盤限制的約束,本質(zhì)上是一個大的消息緩沖區(qū)。許多生產(chǎn)者可以將消息發(fā)送到一個隊列,許多消費者可以嘗試從一個隊列接收數(shù)據(jù)。
- 消費者:消費與接收具有相似的含義。消費者大多時候是一個等待接收消息的程序。請注意生產(chǎn)者,消費者和消息中間件很多時候并不在同一機器上。同一個應(yīng)用程序既可以是生產(chǎn)者又是可以是消費者
六、工作原理
各個名詞的介紹:文章來源:http://www.zghlxwxcb.cn/news/detail-783092.html
- Broker:接收和分發(fā)消息的應(yīng)用,RabbitMQ Server 就是 Message Broker
- Connection:publisher/consumer 和 broker 之間的 TCP 連接
- Channel:如果每一次訪問 RabbitMQ 都建立一個 Connection,在消息量大的時候建立 TCP Connection 的開銷將是巨大的,效率也較低。Channel 是在 connection 內(nèi)部建立的邏輯連接,如果應(yīng)用程序支持多線程,通常每個 thread 創(chuàng)建單獨的 channel 進行通訊,AMQP method 包含了 channel id 幫助客戶端和 message broker 識別 channel,所以 channel 之間是完全隔離的Channel 作為輕量級的Connection 極大減少了操作系統(tǒng)建立 TCP connection 的開銷
- Exchange:message 到達 broker 的第一站,根據(jù)分發(fā)規(guī)則,匹配查詢表中的 routing key,分發(fā)消息到 queue 中去。常用的類型有:direct (point-to-point), topic (publish-subscribe) and fanout (multicast)
- Queue:消息最終被送到這里等待 consumer 取走
- Binding:exchange 和 queue 之間的虛擬連接,binding 中可以包含 routing key,Binding 信息被保存到 exchange 中的查詢表中,用于 message 的分發(fā)依據(jù)
感謝閱讀,一起進步,嘻嘻~
文章來源地址http://www.zghlxwxcb.cn/news/detail-783092.html
到了這里,關(guān)于【中間件】MQ是什么?RabbitMQ又是什么?的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!