瞭解消息通信中的一些重點概念對於深化對RabbitMQ的理解有重要的意義;下面從生產者,消費者,信道,隊列,交換器和綁定,來介紹他們在消息通信過程中的角色和作用;
生產者:
創建消息,然後發佈到代理服務器(RabbitMQ)
消費者:
連接到代理服務器(RabbitMQ)上,並訂閱到隊列上。不會知道誰是消息的生產者
整個過程:
生產者創建消息,消費者接收消息。
消息:包括有效載荷與標籤
有效載荷:要傳輸的數據
標籤:描述有效載荷,並且RabbitMQ使用標籤決定誰將獲得消息的拷貝;
信道:
生產者和消費者與代理服務器之間的通信必須建立一個信道。
爲什麼會有,作用?
連接到RabbitMQ,才能消費或者發佈消息,信道是建立在“”真實“”TCP連接內的虛擬連接。AMQP命令都是通過信道發送出去的。
TCP連接和信道的關係
在應用程序與代理服務器之間創建一個TCP連接,TCP一旦打開,就會創建AMQP信道
電纜相當於TCP,信道是一條獨立光纖束,一條TCP連接上創建多少條信道是沒有限制的。
爲什麼不使用TCP連接發送AMQP命令
1.創建和銷燬TCP會話,開銷大
2.如果使用TCP,每個線程連接到RabbitMQ,都要創建連接,造成浪費和性能瓶頸
3.使用一個TCP連接,能夠滿足性能,並且保證線程私密性。效果更好。
隊列:
AMQP消息路由必須三部分:交換器,隊列,綁定
生產者把消息發佈到交換器,消息最後到達隊列,被消費者接收,綁定決定了消息如何從路由器路由到特定的隊列。
隊列是消息通信的基礎模塊
1.爲消息提供了處所,消息在此等待消費
2.對負載均衡來說,隊列是絕佳方案,讓RabbitMQ循環的方式均勻分配消息。
3.隊列是Rabbit中消息的最後終點(除非消息進入“”黑洞“”)
交換器和綁定
消費者從隊列中獲取消息,但是消息是如何到達隊列的呢?
將消息投遞到隊列時,通過把消息發送給交換器來完成。根據確定的規則,RabbitMQ會決定消息投遞到那個隊列。這個規則叫路由鍵(routing key),隊列通過路由鍵綁定到交換器。當把消息發送發送到代理服務器時,消息將擁有一個路由鍵,RabbitMQ會將其和綁定使用的路由鍵進行匹配。匹配成功,消息會投遞到隊列,不匹配則進入黑洞
使用交換機和綁定完成解耦,對於發送消息給服務器的一方來說,不需要關係服務器另一端的邏輯。服務器會根據路由鍵將消息從交換器路由到隊列。
在AMQP中定義類4種類型的交換器:direct,fanout,topic和header。header交換器與其他3個不同,它允許匹配AMQP消息的header而不是路由鍵,不常用;
消息隊列的使用過程大概如下:
(1)客戶端連接到消息隊列服務器,打開一個channel。
(2)客戶端聲明一個exchange,並設置相關屬性。
(3)客戶端聲明一個queue,並設置相關屬性。
(4)客戶端使用routing key,在exchange和queue之間建立好綁定關係。
(5)客戶端投遞消息到exchange。
(6)exchange接收到消息後,就根據消息的key和已經設置的binding,進行消息路由,將消息投遞到一個或多個隊列裏。