談一談RabbitMQ的那些事

面向面試的博客,以問答式Q/A方式呈現。


Question1:簡要介紹一下 RabbitMQ 消息隊列?

Answer1:

RabbitMQ 是一個由 Erlang 語言開發的 AMQP (Advanced Message Queuing Protocol,高級消息隊列協議 )的開源實現。

AMQP :Advanced Message Queue Protocol,高級消息隊列協議。它是應用層協議的一個開放標準,爲面向消息的中間件設計,基於此協議的客戶端與消息中間件可傳遞消息,並不受產品、開發語言等條件的限制。

RabbitMQ 最初起源於金融系統,用於在分佈式系統中存儲轉發消息,在易用性、擴展性、高可用性等方面表現不俗。具體特點包括:

  1. 可靠性(Reliability):RabbitMQ 使用一些機制來保證可靠性,如持久化、傳輸確認、發佈確認。
  2. 靈活的路由(Flexible Routing):在消息進入隊列之前,通過 Exchange 來路由消息的。對於典型的路由功能,RabbitMQ 已經提供了一些內置的 Exchange 來實現。針對更復雜的路由功能,可以將多個 Exchange 綁定在一起,也通過插件機制實現自己的 Exchange 。
  3. 消息集羣(Clustering):多個 RabbitMQ 服務器可以組成一個集羣,形成一個邏輯 Broker 。
  4. 高可用(Highly Available Queues):隊列可以在集羣中的機器上進行鏡像,使得在部分節點出問題的情況下隊列仍然可用。
  5. 多種協議(Multi-protocol):RabbitMQ 支持多種消息隊列協議,比如 STOMP、MQTT等等。
  6. 多語言客戶端(Many Clients):RabbitMQ 幾乎支持所有常用語言,比Java、.NET、Ruby 等等。
  7. 管理界面(Management UI):RabbitMQ 提供了一個易用的用戶界面,使得用戶可以監控和管理消息 Broker 的許多方面。
  8. 跟蹤機制(Tracing):如果消息異常,RabbitMQ 提供了消息跟蹤機制,使用者可以找出發生了什麼。
  9. 插件機制(Plugin System):RabbitMQ 提供了許多插件,來從多方面進行擴展,也可以編寫自己的插件。

Question2:簡要介紹一下 RabbitMQ 架構?

Answer2:

RabbitMQ架構,如下圖所示:
在這裏插入圖片描述
1、Message
消息,消息是不具名的,它由消息頭和消息體組成。消息體是不透明的,而消息頭則由一系列的可選屬性組成,這些屬性包括 routing-key(路由鍵)、priority(相對於其他消息的優先權)、delivery-mode(指出該消息可能需要持久性存儲)等。

2、Publisher
消息的生產者,也是一個向交換器發佈消息的客戶端應用程序。

3、Exchange(將消息路由給隊列 )
交換器,用來接收生產者發送的消息並將這些消息路由給服務器中的隊列。

4、Binding(消息隊列和交換器之間的關聯)
綁定,用於消息隊列和交換器之間的關聯。一個綁定就是基於路由鍵將交換器和消息隊列連接起來的路由規則,所以可以將交換器理解成一個由綁定構成的路由表。

5、Queue
消息隊列,用來保存消息直到發送給消費者。它是消息的容器,也是消息的終點。一個消息可投入一個或多個隊列。消息一直在隊列裏面,等待消費者連接到這個隊列將其取走。

6、Connection
網絡連接,比如一個 TCP 連接。

7、Channel
信道,多路複用連接中的一條獨立的雙向數據流通道。信道是建立在真實的 TCP 連接內地虛擬連接,AMQP 命令都是通過信道發出去的,不管是發佈消息、訂閱隊列還是接收消息,這些動作都是通過信道完成。因爲對於操作系統來說建立和銷燬 TCP 都是非常昂貴的開銷,所以引入了信道的概念,以複用一條 TCP 連接。

8、Consumer
消息的消費者,表示一個從消息隊列中取得消息的客戶端應用程序。

9、Virtual Host
虛擬主機,表示一批交換器、消息隊列和相關對象。虛擬主機是共享相同的身份認證和加密環境的獨立服務器域。

10、Broker
表示消息隊列服務器實體。


Question3:談一談 Exchange 分發消息的不同策略?

Answer3:

Exchange 分發消息時根據類型的不同分發策略有區別,目前共四種類型:direct、fanout、topic、headers 。headers 匹配 AMQP 消息的 header 而不是路由鍵,此外 headers 交換器和direct 交換器完全一致,但性能差很多,目前幾乎用不到了,所以直接看另外三種類型:

1、Direct 鍵(routing key)分佈

Direct:消息中的路由鍵(routing key)如果和 Binding 中的 binding key 一致,交換器就將消息發到對應的隊列中。它是完全匹配、單播的模式。Direct Exchange如下圖所示:

在這裏插入圖片描述

上圖表示,direct類型下,當routing key與binding key完全匹配時,圖中 routing key=key routing key=key 完全匹配,交換器就將消息發到對應的隊列中,最後消費者從消息隊列中取出消息用來消費。

2、Fanout(廣播分發)

Fanout:每個發到 fanout 類型交換器的消息都會分到所有綁定的隊列上去(很像子網廣播,每臺子網內的主機都獲得了一份複製的消息)。fanout 類型轉發消息是最快的。

Fanout Exchange如下圖所示:
在這裏插入圖片描述

上圖表示,fanout類型下,交換器的所有的消息像廣播一樣分到所有綁定的隊列上去,最後消費者從消息隊列中取出消息用來消費。

3、topic 交換器(模式匹配)

topic 交換器:topic 交換器通過模式匹配分配消息的路由鍵屬性,將路由鍵和某個模式進行匹配,此時隊列需要綁定到一個模式上。它將路由鍵和綁定鍵的字符串切分成單詞,這些單詞之間用點隔開。它同樣也會識別兩個通配符:符號“#”和符號“”。#匹配 0 個或多個單詞,匹配不多不少一個單詞。

Topic Exchange如下圖所示:

在這裏插入圖片描述

topic類型和direct類型有相似之處,都是routing key和binding key匹配,不同的是,direct類型的時候,binding key是確定的,兩者是完全匹配,topic類型的時候,binding key是一種匹配模式,匹配符合這種模式的routing key,當然符合這種模式的routing key就不只一個嘍。
上圖中,模式匹配爲:
binding.key=usa.# 匹配 routing.key=usa.news routing.key=usa.weather;
binding.key=#.news 匹配 routing.key=usa.news routing.key=europe.news;
binding.key=#.weather 匹配 routing.key=usa.weather routing.key=europe.weather;
binding.key=europe.# 匹配 routing.key=europe.news routing.key=europe.weather。
滿足模式匹配後,交換器就將消息發到對應的隊列中,最後消費者從消息隊列中取出消息用來消費。

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章