1 生產者發送消息的流程
(1)生產者連接RabbitMQ,建立TCP連接(Connection),開啟信道(Channel)
(2)生產者聲明一個Exchange (交換器),并設置相關屬性,比如交換器類型、是否持久化等
(3)生產者聲明一個隊列井設置相關屬性,比如是否排他、是否持久化、是否自動刪除等
(4)生產者通過bindingKey (綁定Key) 將交換器和隊列綁定(binding)起來
(5)生產者發送消息至RabbitMQ Broker,其中包含routingKey (路由鍵)、交換器等信息
(6)相應的交換器根據接收到的routingkey查找相匹配的隊列。
(7)如果找到,則將從生產者發送過來的消息存入相應的隊列中。
(8)如果沒有找到,則根據生產者配置的屬性選擇丟棄還是回退給生產者
(9)關閉信道。
(10)關閉連接。
2 消費者接收消息的過程
(1)消費者連接到RabbitMQ Broker,建立一個連接(Connection),開啟一個信道(Channel)。
(2)消費者向RabbitMQ Broker請求消費相應隊列中的消息,可能會設置相應的回調函數,以及做一些準備工作
(3)等待RabbitMQ Broker回應并投遞相應隊列中的消息,消費者接收消息。
(4)消費者確認(ack)接收到的消息。
(5)?RabbitMQ從隊列中刪除相應己經被確認的消息。
(6)關閉信道。
(7)關閉連接。
3 Connection和Channel關系
生產者和消費者,需要與RabbitMQ Broker建立TCP連接,也就是Connection。一旦TCP連接建立起來,客戶端緊接著創建一個AMQP 信道(Channel),每個信道都會被指派一個唯一的ID。信道是建立在Connection之上的虛擬連接,RabbitMQ處理的每條AMQP指令都是通過信道完成的。
為什么不直接使用TCP連接,而是使用信道?
RabbitMQ采用類似NIO的做法,復用TCP連接,減少性能開銷,便于管理。
當每個信道的流量不是很大時,復用單一的Connection可以在產生性能瓶頸的情況下有效地節省TCP連接資源。
當信道本身的流量很大時,一個Connection就會產生性能瓶頸,流量被限制。需要建立多個Connection,分攤信道。具體的調優看業務需要。
信道在AMQP中是一個很重要的概念,大多數操作都是在信道這個層面進行的。
channe1.exchangeDeclare
channe1.queueDeclare
channe1.basicPublish
channe1.basicConsume
//
RabbitMQ相關的API與AMQP緊密相連,比如channel.basicPublish對應AMQP的Basic.Publish命令。