RabbitMQ核心概念以及工作原理
我們來看看流行的RabbitMQ消息系統(tǒng)以及它是如何讓你的系統(tǒng)之間進行解耦的驱证。
在這篇短文里将塑,我們會介紹什么是RabbitMQ缕贡,它是如何工作的以及RabbitMQ的核心概念拙绊。
RabbitMQ是一個開源的消息代理軟件刹孔。它接收生產(chǎn)者發(fā)布的消息并發(fā)送給消費者。它扮演中間商的角色丐枉,可以用來降低web服務(wù)器因發(fā)送消息帶來的負載以及延時哆键。
RabbitMQ如何工作的?
我們來簡單看看RabbitMQ是如何工作的瘦锹。
首先來看看RabbitMQ里的幾個重要概念:
- 生產(chǎn)者(Producer):發(fā)送消息的應(yīng)用籍嘹。
- 消費者(Consumer):接收消息的應(yīng)用。
- 隊列(Queue):存儲消息的緩存弯院。
- 消息(Message):由生產(chǎn)者通過RabbitMQ發(fā)送給消費者的信息辱士。
- 連接(Connection):連接RabbitMQ和應(yīng)用服務(wù)器的TCP連接。
- 通道(Channel):連接里的一個虛擬通道听绳。當(dāng)你通過消息隊列發(fā)送或者接收消息時颂碘,這個操作都是通過通道進行的。
- 交換機(Exchange):交換機負責(zé)從生產(chǎn)者那里接收消息辫红,并根據(jù)交換類型分發(fā)到對應(yīng)的消息列隊里凭涂。要實現(xiàn)消息的接收,一個隊列必須到綁定一個交換機贴妻。
- 綁定(Binding):綁定是隊列和交換機的一個關(guān)聯(lián)連接切油。
- 路由鍵(Routing Key):路由鍵是供交換機查看并根據(jù)鍵來決定如何分發(fā)消息到列隊的一個鍵。路由鍵可以說是消息的目的地址名惩。
生產(chǎn)者(Producer)發(fā)送/發(fā)布消息到代理->消費者(Consumer)從代理那里接收消息澎胡。哪怕生產(chǎn)者和消費者運行在不同的機器上,RabbitMQ也能扮演代理中間件的角色娩鹉。
當(dāng)生產(chǎn)者發(fā)送消息時攻谁,它并不是直接把消息發(fā)送到隊列里的,而是使用交換機(Exchange)來發(fā)送弯予。下面的設(shè)計圖簡單展示了這三個主要的組件之間是如何連接起來的戚宦。
交換機代理(exchange agent)負責(zé)把消息分發(fā)到不同的隊列里。這樣的話锈嫩,消息就能夠從生產(chǎn)者發(fā)送到交換機受楼,然后被分發(fā)到消息隊列里。這就是常見的“發(fā)布”方法呼寸。
然后艳汽,消息會被消費者從隊列里讀取并消費,這就是“消費”对雪。
往多個隊列里發(fā)送消息
對一個復(fù)雜的應(yīng)用而言河狐,往往會有多個消息隊列,所以消息也會被發(fā)往多個隊列瑟捣。
給帶有多個隊列的交換機發(fā)送的消息是通過綁定和路由鍵來進行分發(fā)的馋艺。綁定是你設(shè)置的用來連接一個隊列和交換機的連接。路由鍵是消息的一個屬性迈套。交換機會根據(jù)路由鍵來決定消息分發(fā)到那個隊列里(取決于交換機的類型)丈钙。
交換機(Exchange)
消息并不是直接發(fā)布到隊里里的,而是被生產(chǎn)者發(fā)送到一個交換機上交汤。交換機負責(zé)把消息發(fā)布到不同的隊列里雏赦。交換機從生產(chǎn)者應(yīng)用上接收消息,然后根據(jù)綁定和路由鍵將消息發(fā)送到對應(yīng)的隊列里芙扎。綁定是交換機和隊列之間的一個關(guān)系連接星岗。
RabbitMQ里的消息流程
- 生產(chǎn)者(producer)把消息發(fā)送給交換機。當(dāng)你創(chuàng)建交換機的時候戒洼,你需要指定類型俏橘。交換機的類型接下來會講到。
- 交換機(exchange)接收消息并且負責(zé)對消息進行路由圈浇。根據(jù)交換機的類型寥掐,消息的多個屬性會被使用靴寂,例如路由鍵。
- 綁定(binding)需要從交換機到隊列的這種方式來進行創(chuàng)建召耘。在這個例子里百炬,我們可以看到交換機有到兩個不同隊列的綁定。交換機根據(jù)消息的屬性來把消息分發(fā)到不同的隊列上污它。
- 消息(message)消息會一直留在隊列里直到被消費剖踊。
- 消費者(consumer)處理消息。
交換機類型
- 直接(Direct):直接交換機通過消息上的路由鍵直接對消息進行分發(fā)衫贬。
- 扇出(Fanout):一個扇出交換機會將消息發(fā)送到所有和它進行綁定的隊列上德澈。
- 主題(Topic):這個交換機會將路由鍵和綁定上的模式進行通配符匹配。
- 消息頭(Headers):消息頭交換機使用消息頭的屬性進行消息路由固惯。
RabbitMQ核心概念
- 生產(chǎn)者(Producer):發(fā)送消息的應(yīng)用梆造。
- 消費者(Consumer):接收消息的應(yīng)用。
- 隊列(Queue):存儲消息的緩存葬毫。
- 消息(Message):又生產(chǎn)者通過RabbitMQ發(fā)送給消費者的信息澳窑。
- 連接(Connection):連接RabbitMQ和應(yīng)用服務(wù)器的TCP連接。
- 通道(Channel):連接里的一個虛擬通道供常。當(dāng)你通過消息隊列發(fā)送或者接收消息時摊聋,這個操作都是通過通道進行的。
- 交換機(Exchange):從生產(chǎn)者那里接收消息栈暇,并根據(jù)交換類型分發(fā)到對應(yīng)的消息列隊里麻裁。要實現(xiàn)消息的接收,一個隊列必須綁定一個交換機源祈。
- 綁定(Binding):綁定是隊列和交換機的一個鏈接煎源。
- 路由鍵(Routing Key):路由鍵是供交換機查看并根據(jù)鍵的值來決定如何分發(fā)消息到列隊的一個鍵。路由鍵可以說是消息的目的地址香缺。
- AMQP:AMQP(高級消息隊列協(xié)議Advanced Message Queuing Protocol)是RabbitMQ使用的消息協(xié)議手销。
- 用戶(Users):在RabbitMQ里,是可以通過指定的用戶名和密碼來進行連接的图张。每個用戶可以分配不同的權(quán)限锋拖,例如讀權(quán)限,寫權(quán)限以及在實例里進行配置的權(quán)限祸轮。
如果你已經(jīng)熟悉了RabbitMQ的核心概念以及它的工作原理兽埃,我們接下來就可以通過下面的文章來進行實戰(zhàn)了:
RabbitMQ Java HelloWorld Example - 這篇文章會講解如何在Java里實現(xiàn)RabbitMQ的HelloWorld例子.
RabbitMQ Tutorial with Publish/Subscribe Example - 這篇文章里會講解RabbitMQ,并一步一步來搭建一個”生產(chǎn)者/消費者“的實例适袜。