RabbitMQ面試專題,面試必看

Java架構分享發表於2020-10-07

需要後續RabbitMQ面試題的點贊+關注,私信我獲取

1.RabbitMQ是什麼?

RabbitMQ是實現了高階訊息佇列協議(AMQP)的開源訊息代理軟體(亦稱面向訊息的中介軟體)。RabbitMQ伺服器是用Erlang語言編寫的,而群集和故障轉移是構建在開放電信平臺框架上的。所有主要的程式語言均有與代理介面通訊的客戶端庫。

2.RabbitMQ特點?

可靠性: RabbitMQ使用一些機制來保證可靠性, 如持久化、傳輸確認及釋出確認等。

靈活的路由 : 在訊息進入佇列之前,通過交換器來路由訊息。對於典型的路由功能, RabbitMQ 己經提供了一些內建的交換器來實現。針對更復雜的路由功能,可以將多個 交換器繫結在一起, 也可以通過外掛機制來實現自己的交換器。

擴充套件性: 多個RabbitMQ節點可以組成一個叢集,也可以根據實際業務情況動態地擴充套件 叢集中節點。

高可用性 : 佇列可以在叢集中的機器上設定映象,使得在部分節點出現問題的情況下隊 列仍然可用。

多種協議: RabbitMQ除了原生支援AMQP協議,還支援STOMP, MQTT等多種訊息 中介軟體協議。

多語言客戶端 :RabbitMQ 幾乎支援所有常用語言,比如 Java、 Python、 Ruby、 PHP、 C#、 JavaScript 等。

管理介面 : RabbitMQ 提供了一個易用的使用者介面,使得使用者可以監控和管理訊息、集 群中的節點等。

令外掛機制: RabbitMQ 提供了許多外掛 , 以實現從多方面進行擴充套件,當然也可以編寫自 己的外掛。

3.AMQP是什麼?

RabbitMQ就是 AMQP 協議的 Erlang 的實現(當然 RabbitMQ 還支援 STOMP2、 MQTT3 等協議 ) AMQP 的模型架構 和 RabbitMQ 的模型架構是一樣的,生產者將訊息傳送給交換器,交換器和佇列繫結 。

RabbitMQ 中的交換器、交換器型別、佇列、繫結、路由鍵等都是遵循的 AMQP 協議中相 應的概念。目前 RabbitMQ 最新版本預設支援的是 AMQP 0-9-1。

4.AMQP協議3層?

Module Layer:協議最高層,主要定義了一些客戶端呼叫的命令,客戶端可以用這些命令實現自己的業務邏輯。

Session Layer:中間層,主要負責客戶端命令傳送給伺服器,再將服務端應答返回客戶端,提供可靠性同步機制和錯誤處理。

TransportLayer:最底層,主要傳輸二進位制資料流,提供幀的處理、通道服用、錯誤檢測和資料表示等。

5.AMQP模型的幾大元件?

  • 交換器 (Exchange):訊息代理伺服器中用於把訊息路由到佇列的元件。

  • 佇列 (Queue):用來儲存訊息的資料結構,位於硬碟或記憶體中。

  • 繫結 (Binding): 一套規則,告知交換器訊息應該將訊息投遞給哪個佇列。

6.生產者Producer?

訊息生產者,就是投遞訊息的一方。

訊息一般包含兩個部分:訊息體(payload)和標籤(Label)。

7.消費者Consumer?

消費訊息,也就是接收訊息的一方。

消費者連線到RabbitMQ伺服器,並訂閱到佇列上。消費訊息時只消費訊息體,丟棄標籤。

8.Broker服務節點?

Broker可以看做RabbitMQ的服務節點。一般請下一個Broker可以看做一個RabbitMQ伺服器。

9.Queue佇列?

Queue:RabbitMQ的內部物件,用於儲存訊息。多個消費者可以訂閱同一佇列,這時佇列中的訊息會被平攤(輪詢)給多個消費者進行處理。

10.Exchange交換器?

Exchange:生產者將訊息傳送到交換器,有交換器將訊息路由到一個或者多個佇列中。當路由不到時,或返回給生產者或直接丟棄。

11.RoutingKey路由鍵?

生產者將訊息傳送給交換器的時候,會指定一個RoutingKey,用來指定這個訊息的路由規則,這個RoutingKey需要與交換器型別和繫結鍵(BindingKey)聯合使用才能最終生效。

12.Binding繫結?

通過繫結將交換器和佇列關聯起來,一般會指定一個BindingKey,這樣RabbitMq就知道如何正確路由訊息到佇列了。

13.交換器4種型別?

主要有以下4種。

fanout:把所有傳送到該交換器的訊息路由到所有與該交換器繫結的佇列中。

direct:把訊息路由到BindingKey和RoutingKey完全匹配的佇列中。

topic:

匹配規則:

RoutingKey 為一個 點號'.': 分隔的字串。 比如: java.xiaoka.show

BindingKey和RoutingKey一樣也是點號“.“分隔的字串。

BindingKey可使用 * 和 # 用於做模糊匹配,*匹配一個單詞,#匹配多個或者0個

headers:不依賴路由鍵匹配規則路由訊息。是根據傳送訊息內容中的headers屬性進行匹配。效能差,基本用不到。

14.生產者訊息運轉?

1.Producer先連線到Broker,建立連線Connection,開啟一個通道(Channel)。

2.Producer宣告一個交換器並設定好相關屬性。

3.Producer宣告一個佇列並設定好相關屬性。

4.Producer通過路由鍵將交換器和佇列繫結起來。

5.Producer傳送訊息到Broker,其中包含路由鍵、交換器等資訊。

6.相應的交換器根據接收到的路由鍵查詢匹配的佇列。

7.如果找到,將訊息存入對應的佇列,如果沒有找到,會根據生產者的配置丟棄或者退回給生產者。

8.關閉通道。

9.管理連線。

15.消費者接收訊息過程?

1.Producer先連線到Broker,建立連線Connection,開啟一個通道(Channel)。

2.向Broker請求消費響應的佇列中訊息,可能會設定響應的回撥函式。

3.等待Broker回應並投遞相應佇列中的訊息,接收訊息。

4.消費者確認收到的訊息,ack。

5.RabbitMq從佇列中刪除已經確定的訊息。

6.關閉通道。

7.關閉連線。

16.交換器無法根據自身型別和路由鍵找到符合條件佇列時,有哪些處理?

mandatory :true 返回訊息給生產者。

mandatory: false 直接丟棄。

17.死信佇列?

DLX,全稱為 Dead-Letter-Exchange,死信交換器,死信郵箱。當訊息在一個佇列中變成死信 (dead message) 之後,它能被重新被髮送到另一個交換器中,這個交換器就是 DLX,繫結 DLX 的佇列就稱之為死信佇列。

18.導致的死信的幾種原因?

  • 訊息被拒(Basic.Reject /Basic.Nack) 且 requeue = false。

  • 訊息TTL過期。

  • 佇列滿了,無法再新增。

19.延遲佇列?

儲存對應的延遲訊息,指當訊息被髮送以後,並不想讓消費者立刻拿到訊息,而是等待特定時間後,消費者才能拿到這個訊息進行消費。

20.優先順序佇列?

優先順序高的佇列會先被消費。

可以通過x-max-priority引數來實現。

當消費速度大於生產速度且Broker沒有堆積的情況下,優先順序顯得沒有意義。

21.事務機制?

RabbitMQ 客戶端中與事務機制相關的方法有三個:

channel.txSelect 用於將當前的通道設定成事務模式。

channel . txCommit 用於提交事務 。

channel . txRollback 用於事務回滾,如果在事務提交執行之前由於 RabbitMQ 異常崩潰或者其他原因丟擲異常,通過txRollback來回滾。

22.傳送確認機制?

生產者把通道設定為confirm確認模式,設定後,所有再改通道釋出的訊息都會被指定一個唯一的ID,一旦訊息被投遞到所有匹配的佇列之後,RabbitMQ就會傳送一個確認(Basic.Ack)給生產者(包含訊息的唯一ID),這樣生產者就知道訊息到達對應的目的地了。

23.消費者獲取訊息的方式?

24.消費者某些原因無法處理當前接受的訊息如何來拒絕?

  • channel .basicNack

  • channel .basicReject

25.訊息傳輸保證層級?

At most once:最多一次。訊息可能會丟失,單不會重複傳輸。

At least once:最少一次。訊息覺不會丟失,但可能會重複傳輸。

Exactly once: 恰好一次,每條訊息肯定僅傳輸一次。

26.vhost?

每一個RabbitMQ伺服器都能建立虛擬的訊息伺服器,也叫虛擬主機(virtual host),簡稱vhost。

預設為“/”。

27.叢集中的節點型別?

記憶體節點:ram,將變更寫入記憶體。

磁碟節點:disc,磁碟寫入操作。

RabbitMQ要求最少有一個磁碟節點。

28.佇列結構?

通常由以下兩部分組成?

rabbit_amqqueue_process :負責協議相關的訊息處理,即接收生產者釋出的訊息、向消費者交付訊息、處理訊息的確認(包括生產端的 confirm 和消費端的 ack) 等。

backing_queue:是訊息儲存的具體形式和引擎,並向 rabbit amqqueue process 提供相關的介面以供呼叫。

29.RabbitMQ中訊息可能有的幾種狀態?

alpha: 訊息內容(包括訊息體、屬性和 headers) 和訊息索引都儲存在記憶體中 。

beta: 訊息內容儲存在磁碟中,訊息索引儲存在記憶體中。

gamma: 訊息內容儲存在磁碟中,訊息索引在磁碟和記憶體中都有 。

delta: 訊息內容和索引都在磁碟中 。

相關文章