RabbitMQ:RabbitMQ架構(gòu)和工作流程
一、介紹
RabbitMQ,俗稱“兔子MQ”(可見其輕巧,敏捷),是目前非常熱門的一款開源消息中間件,不管 是互聯(lián)網(wǎng)行業(yè)還是傳統(tǒng)行業(yè)都廣泛使用(最早是為了解決電信行業(yè)系統(tǒng)之間的可靠通信而設(shè)計)。
1. 高可靠性、易擴(kuò)展、高可用、功能豐富等
2. 支持大多數(shù)(甚至冷門)的編程語言客戶端。
3. RabbitMQ遵循AMQP協(xié)議,自身采用Erlang(一種由愛立信開發(fā)的通用面向并發(fā)編程的語 言)編寫。
4. RabbitMQ也支持MQTT等其他協(xié)議。
RabbitMQ具有很強(qiáng)大的插件擴(kuò)展能力,官方和社區(qū)提供了非常豐富的插件可供選擇:
https://www.rabbitmq.com/community-plugins.html
二、整體邏輯架構(gòu)
1、RabbitMQ Exchange類型
RabbitMQ常用的交換器類型有: fanout 、 direct 、 topic 、 headers 四種。
Fanout
fanout會把所有發(fā)送到該交換器的消息路由到所有與該交換器綁定的隊列中,如圖:
Direct
direct類型的交換器路由規(guī)則很簡單,它會把消息路由到那些BindingKey和RoutingKey完全匹配的 隊列中,如下圖:
Topic
topic類型的交換器在direct匹配規(guī)則上進(jìn)行了擴(kuò)展,也是將消息路由到BindingKey和RoutingKey 相匹配的隊列中,這里的匹配規(guī)則稍微不同,它約定: BindingKey和RoutingKey一樣都是由"."分隔的字符串;BindingKey中可以存在兩種特殊字符“*”和 “#”,用于模糊匹配,其中"*"用于匹配一個單詞,"#"用于匹配多個單詞(可以是0個)。
Headers
headers類型的交換器不依賴于路由鍵的匹配規(guī)則來路由信息,而是根據(jù)發(fā)送的消息內(nèi)容中的 headers屬性進(jìn)行匹配。在綁定隊列和交換器時指定一組鍵值對,當(dāng)發(fā)送的消息到交換器時, RabbitMQ會獲取到該消息的headers,對比其中的鍵值對是否完全匹配隊列和交換器綁定時指定的鍵 值對,如果匹配,消息就會路由到該隊列。headers類型的交換器性能很差,不實用。
2、RabbitMQ數(shù)據(jù)存儲
RabbitMQ消息有兩種類型: 1. 持久化消息和非持久化消息。 2. 這兩種消息都會被寫入磁盤。
持久化消息在到達(dá)隊列時寫入磁盤,同時會內(nèi)存中保存一份備份,當(dāng)內(nèi)存吃緊時,消息從內(nèi)存中清 除。這會提高一定的性能。
非持久化消息一般只存于內(nèi)存中,當(dāng)內(nèi)存壓力大時數(shù)據(jù)刷盤處理,以節(jié)省內(nèi)存空間。
RabbitMQ存儲層包含兩個部分:隊列索引和消息存儲。
三、工作流程
1、生產(chǎn)者發(fā)送消息的流程
1)生產(chǎn)者連接RabbitMQ,建立TCP連接( Connection),開啟信道(Channel)
2)生產(chǎn)者聲明一個Exchange(交換器),并設(shè)置相關(guān)屬性,比如交換器類型、是否持久化等
3)生產(chǎn)者聲明一個隊列井設(shè)置相關(guān)屬性,比如是否排他、是否持久化、是否自動刪除等
4)生產(chǎn)者通過 bindingKey (綁定Key)將交換器和隊列綁定( binding )起來
5)生產(chǎn)者發(fā)送消息至RabbitMQ Broker,其中包含 routingKey (路由鍵)、交換器等信息
6) 相應(yīng)的交換器根據(jù)接收到的 routingKey 查找相匹配的隊列。
7)如果找到,則將從生產(chǎn)者發(fā)送過來的消息存入相應(yīng)的隊列中。
8)如果沒有找到,則根據(jù)生產(chǎn)者配置的屬性選擇丟棄還是回退給生產(chǎn)者
9)關(guān)閉信道。
10)關(guān)閉連接。
2、 消費者接收消息的過程
1) 消費者連接到RabbitMQ Broker ,建立一個連接(Connection ) ,開啟一個信道(Channel) 。
2)消費者向RabbitMQ Broker 請求消費相應(yīng)隊列中的消息,可能會設(shè)置相應(yīng)的回調(diào)函數(shù), 以及 做一些準(zhǔn)備工作
3)等待RabbitMQ Broker 回應(yīng)并投遞相應(yīng)隊列中的消息, 消費者接收消息。
4)消費者確認(rèn)( ack) 接收到的消息。
5)RabbitMQ 從隊列中刪除相應(yīng)已經(jīng)被確認(rèn)的消息。
6)關(guān)閉信道。
7)關(guān)閉連接。