RabbitMQ:RabbitMQ架構和工作流程
一、介紹
RabbitMQ,俗稱“兔子MQ”(可見其輕巧,敏捷),是目前非常熱門的一款開源消息中間件,不管 是互聯網行業還是傳統行業都廣泛使用(最早是為了解決電信行業系統之間的可靠通信而設計)。
1. 高可靠性、易擴展、高可用、功能豐富等
2. 支持大多數(甚至冷門)的編程語言客戶端。
3. RabbitMQ遵循AMQP協議,自身采用Erlang(一種由愛立信開發的通用面向并發編程的語 言)編寫。
4. RabbitMQ也支持MQTT等其他協議。
RabbitMQ具有很強大的插件擴展能力,官方和社區提供了非常豐富的插件可供選擇:
https://www.rabbitmq.com/community-plugins.html
二、整體邏輯架構
1、RabbitMQ Exchange類型
RabbitMQ常用的交換器類型有: fanout 、 direct 、 topic 、 headers 四種。
Fanout
fanout會把所有發送到該交換器的消息路由到所有與該交換器綁定的隊列中,如圖:
Direct
direct類型的交換器路由規則很簡單,它會把消息路由到那些BindingKey和RoutingKey完全匹配的 隊列中,如下圖:
Topic
topic類型的交換器在direct匹配規則上進行了擴展,也是將消息路由到BindingKey和RoutingKey 相匹配的隊列中,這里的匹配規則稍微不同,它約定: BindingKey和RoutingKey一樣都是由"."分隔的字符串;BindingKey中可以存在兩種特殊字符“*”和 “#”,用于模糊匹配,其中"*"用于匹配一個單詞,"#"用于匹配多個單詞(可以是0個)。
Headers
headers類型的交換器不依賴于路由鍵的匹配規則來路由信息,而是根據發送的消息內容中的 headers屬性進行匹配。在綁定隊列和交換器時指定一組鍵值對,當發送的消息到交換器時, RabbitMQ會獲取到該消息的headers,對比其中的鍵值對是否完全匹配隊列和交換器綁定時指定的鍵 值對,如果匹配,消息就會路由到該隊列。headers類型的交換器性能很差,不實用。
2、RabbitMQ數據存儲
RabbitMQ消息有兩種類型: 1. 持久化消息和非持久化消息。 2. 這兩種消息都會被寫入磁盤。
持久化消息在到達隊列時寫入磁盤,同時會內存中保存一份備份,當內存吃緊時,消息從內存中清 除。這會提高一定的性能。
非持久化消息一般只存于內存中,當內存壓力大時數據刷盤處理,以節省內存空間。
RabbitMQ存儲層包含兩個部分:隊列索引和消息存儲。
三、工作流程
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)關閉連接。