前言
RabbitMQ是基於AMQP協議的,要想深入理解RabbitMQ,就必須先了解AMQP是個什么東東?
AMQP協議
AMQP即Advanced Message Queuing Protocol,高級消息隊列協議,是面向消息中間件設計的應用層協議的一個開放標准。
AMQP是一個應用層協議,可以把它類比為HTTP協議,底層都是基於TCP/IP協議的,只不過它是針對消息中間件設定的,它的設計都是為了實現在生產者和消費者中間傳遞消息。默認端口為5672。
接下來我們來分析分析AMQP協議的設計模型(這其實也是RabbitMQ的設計模型)
可以看到AMQP是生產者消費者模型,生產者向服務器的交換機發布消息,交換機Exchange通過設定的路由規則binding(有四種)綁定的消息隊列queue發送消息。消費者訂閱服務器的消息隊列,接收Message。
RabbitMQ的架構分析

其實大致上和AMQP差不多,AMQP中也有channel,只是我沒畫出來。
- channel:信道,多路復用連接中的一條獨立的雙向數據流通道,為會話提供物理傳輸介質,在客戶端的每個連接里,可建立多個通道。
下面說一下我對RabbitMQ的理解
RabbitMQ就是一個中間件,你可以把它類比成 Redis。RabbitMQ服務器中有多個虛擬機,相當於 Redis 中的數據庫。
生產者通過channel連接到交換機,先把信息發到交換機,交換機再通過路由規則(binding)把信息發送給綁定的隊列。
生產者只能將消息發送到交換機,它甚至都不知道隊列的存在。交換機一方面接收來自生產者的消息,另一方面,將它們推入隊列。因此交換機必須確切知道如何處理收到的消息。是否應將其附加到特定隊列?是否應該將其附加到許多隊列中?還是應該將其丟棄。規則(也就是上圖的binding)由交換類型定義,常見的交換機類型有四種:direct, topic, headers 和fanout。
注意:Exchange(交換機)只負責轉發消息,不具備存儲消息的能力,因此如果沒有任何隊列與Exchange綁定,或者沒有符合路由規則的隊列,那么消息會丟失!
消費者不和交換機打交道,它訂閱接收隊列的信息。一旦隊列不為空,它就隨時取出消費。因此生產者生產完信息后可以關閉,消費者不能關閉,要一直監聽隊列。