RabbitMQ原理讲解
生活随笔
收集整理的這篇文章主要介紹了
RabbitMQ原理讲解
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
我們來看RabbitMQ的原理介紹,現在大家看到的這個圖呢,其實就是通過圖形方式,表達了RabbitMQ的原理結構圖,先不著急看第二個圖,先來看第一個,其實這個圖介紹了RabbitMQ一個消息的提供者發送消息,直到消費者接收消息他的消息在RabbitMQ當中,是怎么處理的,這里會有一些常見的MQ當中的介紹,在這里主要講的是這些組件的信息
我把表格里常見的組件,整理到一個表格當中,并且加了說明,我們來看一下,第一個Message消息,那么什么是消息呢,其實就是從生產者,發送的信息,到接收者鎖接收到的數據,我們稱之為消息,其實消息的構成呢,就是由一個字符串的二進制的,表現形式來構成的,底層其實都是二進制的,我們來看一下,消息是不具名的,也就是消息它是不具備名稱的,它是由消息頭和消息體組成的,這個非常重要,比如我們要把一個HelloWorld,從Provider提供到發送到Consumer,過程當中,其實消息是包含頭和體兩個部分組成的,然后我們看一下,消息體是不透明的,消息頭是由一系列可選的屬性組成,消息頭是很重要的,消息頭里包括了什么呢,比如路由件,還有相對于其他消息的優先權,還有指出消息可能持久性的一些設置,那么我們可以根據自己的需求,對消息頭的屬性,來做一些設置,來決定這個消息是什么樣的消息,是否要做持久性的操作,他的路由鍵是什么,消息頭加上我們具體的消息,其實就構成一個完整的消息,我們再來看第二個,Publisher,這個指的是什么呢,消息的生產者,就是這一塊,Provider,也是向交換器發布消息的客戶端應用程序,這塊就不用多說了,然后Consumer,Comsumer是消息的接收者,表示從一個消息隊列中,取得客戶端的應用程序,這個也不用多說了,然后我們來看一下Exchange,Exchange是什么呢,這個是非常重要的,它是一個交換器,交換器是用來接收生產者發送的消息,并將這些信息路由給服務器中的隊列,然后他有三種常見的交換類型,一個是direct,一個是fanout,還有一個是topic,這三種交換方式,決定你的消息是,所以他是一個交換器,也就是說,我們現在發送一個消息,其實并不是直接進入到我們的Queue當中,并不是直接進入到隊列當中,至于你這個消息,要進入到哪個隊列當中,其實是由交換器來決定的,現在我們通過管理頁面來看一下,這是我們MQ的一個管理頁面59.110.158.145:15672在這里是不是也有一個交換器,你看現在交換器有這么些,現在我們用的是AMQP default的交換器,這里面沒有信息,沒有信息產生的原因是什么,是我們現在的服務已經停止了,程序沒有停止,一直使用隊列,那么我們是可以看到的,那我們就做一個服務讓他一直發送消息,我們只要寫一個死循環,我們讓他休眠一下,每一秒發送一下,這個時候我們可以看到消息一直在發送,我們回到管理界面一下,現在我們可以看出來了,交換器里已經有數據流產生了,那么其實交換器呢,是我們講消息中間件最重點的部分,我們會講三種交換器的類型,我們先知道他就可以了,我們只要知道他什么呢,我們在使用消息中間件的時候,或者使用RabbitMQ的時候,他的消息的發送并不是直接進入到隊列里,而是經過交換器,來決定發送到哪個隊列當中,其實這里還有一個非常重要的一個點,就是關于路由鍵的問題,一會咱們再說,咱們再往下看,Binding綁定,這個綁定指的是什么意思呢,由于消息隊列和交換器之間的關聯,一個綁定就是基于路由鍵將交換器和消息隊列連接起來的路由規則,我們一個交換器,要想把消息發送到隊列當中,那首先先要知道隊列,所以交換器和隊列之間,肯定要做一個綁定的處理,那么綁定根據什么區綁定呢,這里說到了,其實根據的就是一個路由鍵,也就是說,在我們發送消息的時候,如果消息的頭信息當中,他頭當中的屬性,路由鍵相同,交換器就會將這個信息,發送到當前這個隊列當中,所以說交換器,跟我們隊列之間的對應關系,是通過綁定來完成的,那么通過什么來綁定的呢,其實就是通過路由鍵來綁定的,我們再來看這個Queue,消息隊列,這個大家已經寫過一個案例了,應該知道了,其實所謂的消息隊列呢,就是用來保存消息直接發送給消費者,這樣的一個信息,它是消息的一個容器,也是消息的一個終點,一個消息可以投入到一個或者多個隊列當中,消息一直在隊列里,等待消費者連接到這個隊列將其取走,就是我們現在看到的這個Queue,我們在管理頁面其實也能看到,這個就是看消息隊列的,我們只有一個隊列,hello-queue,現在有數據的產生,因為我們的程序一直在運行,然后我們再看路由鍵,路由鍵是什么呢,RabbitMQ決定消息該投遞到哪個隊列的一個規則,隊列通過路由鍵綁定到交換器,消息發送到MQ服務器時,消息將擁有一個路由鍵,即便是空的,RabbitMQ也會將其和綁定使用的路由鍵進行匹配,也就是說,即便你消息的頭是空的,他也會去和交換器跟隊列所綁定的路由鍵,做匹配,所以只要我們消息想要放到隊列里,必定會經過交換器當中的路由鍵來做匹配,如果相匹配,就會將消息投遞到該隊列,如果消息并沒有設置路由鍵,那怎么辦呢,那就不匹配唄,如果不匹配,消息就將會進入到黑洞,消息在一個獨立的隊列當中存儲,在老版本的RabbitMQ當中,這個消息就直接丟棄了,直接就不要了,但是新版本的這個里面呢,會用一個單獨的空間來存儲的,咱們再來看Connection,Connection指的是什么呢,鏈接,這個連接指的是什么呢,就是我現在的信息,在我的Rabbit容器里存著呢,那我要把這個信息交給接收者,那我的服務端,肯定要和Consumer建立一個連接,那么這個建立連接的過程,這個連接就叫Connection,應該很好理解,然后咱們再來看信道,我們先看這個圖,一個Connection當中會包含多個信道的,我們來看一下信道的解釋,Channel中文也叫信道,是TCP里的虛擬連接,例如電纜相當于TCP,信道就是一個獨立的光纖束,一條TCP連接上,建立多條信道是沒有問題的,什么意思呢,其實就是在一個連接當中,可以開辟多個通信的通道,才能稱之為信道,那為什么沒有直接使用TCP進行通信了,咱們一會會講到,現在你只要知道,這個信道指的就是,在一個TPC連接當中,開辟了多條通信的通道,TCP一旦打開,就會創建AMQP的通道,無論是發布消息,接收消息,訂閱隊列,這些動作都是通過信道完成的,咱們再來看虛擬主機,虛擬主機是什么意思呢,表示一批交換器,消息隊列和相關的對象,虛擬主機是共享相同的身份認證和加密環境的獨立服務器,每個vhost本質上就是一個mini版的RabbiMQ服務器,擁有自己的隊列,交換器,綁定和權限機制,vhost是AMQP概念的基礎,必須在連接時指定,rabbitmq默認的名稱是/,我們來看,這個一個就是一個虛擬機,一個虛擬機就包含了一個rabbitMQ通信的機制,像交換機,還有隊列,都是在一個虛擬機里來完成的,其實你要理解虛擬機到底是什么,他有點像什么呢,有點像MYSQL數據庫里的那個庫,庫跟庫是隔離的,那么其實在RabbitMQ當中,虛擬機和虛擬機之間也是隔離的,庫跟庫之間的訪問權限,是不一樣的,那么對于虛擬機來講呢,也是這樣的,每個虛擬機都是獨立的,每個虛擬機當中所使用的用戶,關于權限這一塊,也是針對虛擬機來設置的,他不能夠跨虛擬機,那么在一個RabbitMQ當中,我們也可以添加多個虛擬機,我們在MYSQL當中也可以建立多個庫,是一樣的,我們通過管理界面就可以完成,在管理界面就可以完成,在admin這,然后這里有一個虛擬機http://59.110.158.145:15672/#/usershttp://59.110.158.145:15672/#/vhosts然后在這里可以加一個虛擬機,可以給虛擬機起個名的,因為一個用戶名只可以用于當前這個虛擬機,然后角色是通過虛擬機來分配的,這個應該也不難理解,最后一個,其實最后一個我們來看一下,Broker指的是什么意思呢
一個Rabbit的實體就稱之為Broker,那么我們通過表格里的內容,以及對RabbitMQ關鍵的組件的介紹,重點是哪兒呢,交換器和隊列的關系,咱們之前說過交換器,建立在發送消息和隊列之間的交換規則,他決定了將消息放在哪個隊列當中,并且根據你的路由鍵來決定的,哪個消息建在哪個隊列,然后我們來看,交換器是通過路由鍵和隊列綁定在一起的,如果消息擁有的路由鍵跟隊列和交換器的路由鍵匹配,那么消息就會路由到該綁定的隊列當中,也就是說,消息到隊列的過程中,消息首先會經過交換器,接下來消息通過路由鍵,匹配分發消息到具體的隊列當中,路由鍵可以理解為匹配的規則,其實我們在學RabbitMQ的時候,重點就是這個交換器,所以我們接下來也會重點來講解這個交換器,然后再來看關鍵的幾點,RabbitMQ為什么需要信道,為什么不是TCP直接通信,這一塊非常重要,為什么RabbitMQ不是直接通過TCP連接,直接跟消費者進行消息的傳遞,而是建立連接以后,在連接當中,多個信道跟消費者進行消息的傳遞呢,原因在這也給大家寫出來了,一共三點原因,第一個TCP的創建和消費的開銷特別大,我們知道TCP的創建是需要三次握手,銷毀的時候是需要四次分手的,所以正因為他有這么多次握手,有這么多次分手,其實就導致TCP的創建和消費開銷就特別大,這個開銷大性能肯定會受到影響,第二個我們再來看,如果不用信道,那應用程序會以TCP連接到Rabbit,高峰時成千上萬條連接,會造成資源巨大的浪費,就是來一個連接,去創建一個TCP,來一個連接我就去創建TCP,那你想想資源浪費的多么嚴重,然后用完之后還得把它銷毀掉,銷毀的時候還需要四次分手,創建的時候還需要三次握手,你想想這個性能,隨著我們的請求量越來越多,性能所遇到的瓶頸也會越來越大,還有關鍵的一點是什么呢,操作系統每秒處理TCP連接數是有限的,并不是一秒鐘可以去創建無限個連接的,不是這樣的,操作系統對于每秒處理TCP的數量是有一個峰值的,當你達到這個峰值的時候,你就無法建立連接了,所以必定造成性能的一個瓶頸,這也是為什么RabbitMQ,他并不是直接使用TCP,跟我們的Consumer進行直接的通信,再來看,信道的原理,它是一個線程一個信道,它是運行在連接當中的,多條線程就是多個通道,通用一條TCP連接,一條TCP連接可以容納無限的信道,即使成千上萬的請求也不會成為性能的瓶頸,這個是什么意思呢,不管你有多少個消息,我只要和Consumer建立一個Connection連接,然后我所有的消息,都可以通過不同的信道來連接,其實這就很好的解決了什么呢,解決了TCP鏈接慢,和每秒處理TCP鏈接有限制,這樣的一個問題,其實這個技術要找到一個比喻去比喻一下,也是可以找到相關的技術的,就是線程和進程的關系,比如我們每次運行一個程序,都是以一個進程來運行,那你想一想,這將是一個怎樣的現象,如果了解Servlet之前的技術,每次請求在操作系統當中,都是開辟一個進程來處理這個請求,后來發現當請求上來以后,這個處理請求的Servlet,在創建進程的時候,是比較耗時的,第二個是什么呢,造成一個資源浪費,因為一個請求來了,要創建一個進程,進程的開辟,它會占用你的不小的內存空間,后來又做了一個池,把一些servlet的進程,放到池里去初始化,加入池去解決這個問題,也沒有起到一個治本的問題,治標不治本的,直到Servlet誕生,他采用的是單進程多線程的方式,徹底解決這個問題,其實這個跟我們的RabbitMQ當中為什么不用TCP,而是使用的TCP的通道來解決這個原理是一模一樣的,我們主要是講解RabbitMQ的一個原理圖,下面我們主要講交換器的交換規則,交換器類型的使用,這個是我們學習中間件非常重要的一個知識點
?
總結
以上是生活随笔為你收集整理的RabbitMQ原理讲解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 消息队列入门案例-编码
- 下一篇: RaDirect交换器-搭建环境