RabbitMQ面試題


1.RabbitMQ是什么?

1 RabbitMQ是實現了高級隊列協議的消息中間件。
2 
3 什么是消息隊列?
4 就是使用隊列進行通信的組件。

2.RabbitMQ特點?

 1 可靠性: RabbitMQ使用一些機制來保證可靠性, 如持久化、傳輸確認及發布確認等。
 2 
 3 靈活的路由 : 在消息進入隊列之前,通過交換器來路由消息。對於典型的路由功能, RabbitMQ 己經提供了一些內置的交換器來實現。針對更復雜的路
 4        由功能,可以將多個 交換器綁定在一起, 也可以通過插件機制來實現自己的交換器。
 5 
 6 擴展性: 多個RabbitMQ節點可以組成一個集群,也可以根據實際業務情況動態地擴展 集群中節點。
 7 
 8 高可用性 : 隊列可以在集群中的機器上設置鏡像,使得在部分節點出現問題的情況下隊 列仍然可用。
 9 
10 多種協議: RabbitMQ除了原生支持AMQP協議,還支持STOMP, MQTT等多種消息 中間件協議。
11 
12 多語言客戶端 :RabbitMQ 幾乎支持所有常用語言,比如 Java、 Python、 Ruby、 PHP、 C#、 JavaScript 等。
13 
14 管理界面 : RabbitMQ 提供了一個易用的用戶界面,使得用戶可以監控和管理消息、集 群中的節點等。
15 
16 令插件機制 : RabbitMQ 提供了許多插件 , 以實現從多方面進行擴展,當然也可以編寫自 己的插件。

3.AMQP是什么?

1 RabbitMQ就是 AMQP 協議的 Erlang 的實現(當然 RabbitMQ 還支持 STOMP2、 MQTT3 等協議 ) 

#4.AMQP協議3層?

1 Module Layer:協議最高層,主要定義了一些客戶端調用的命令,客戶端可以
2 用這些命令實現自己的業務邏輯。
3 
4 Session Layer:中間層,主要負責客戶端命令發送給服務器,再將服務端應答
5 返回客戶端,提供可靠性同步機制和錯誤處理。
6 
7 TransportLayer:最底層,主要傳輸二進制數據流,提供幀的處理、信道服用、
8 錯誤檢測和數據表示等。

5.AMQP模型的幾大組件?

1 交換器 (Exchange):消息代理服務器中用於把消息路由到隊列的組件。
2 隊列 (Queue):用來存儲消息的數據結構,位於硬盤或內存中。
3 綁定 (Binding):一套規則,告知交換器消息應該將消息投遞給哪個隊列。

6.說說生產者Producer和消費者Consumer?

1 Producer是消息投遞的一方。
2 Consumer是消息獲取的一方。
3 
4 (自由發揮...)

7.為什么需要消息隊列?

1 本質上來說是由於互聯網技術的高速發展,互聯網技術架構不斷演進而催生的產物。
2 
3 隨着技術架構從單體架構到微服務架構,服務的增多使得需要一個工具來解耦,合理利用以及緩沖流量洪峰等。
4 
5 作用:異步處理、服務解耦、流量控制

8.說說Broker服務節點、Queue隊列、Exchange交換器?

1 Broker:可以看做是RabbitMQ下的一個服務節點。
2 Queue:Broker內部的組件,是存儲消息的數據結構,多個消費者可以訂閱同一個隊列,該隊列中的消息會被訂閱該隊列的消費者輪詢接收。
3 Exchange:交換機用來接收消息並將消息根據RoutingKey發送給與該交換機綁定的指定隊列,如果沒有指定隊列消息將會返回給生產者或者直接丟棄。

9.消息隊列有什么優缺點?

1 1:系統可用性降低,一旦MQ崩潰,整個系統也會崩潰
2 2:系統復雜度提高,要解決消息丟失,消息重復消費的問題
3 3:消息傳遞的順序性問題
4 4:一致性問題

10.如何保證消息的可靠性?

1 生產者到RabbitMQ:事務機制和Confirm機制,注意:事務機制和 Confirm 機制是互斥的,兩者不能共存,會導致 RabbitMQ 報錯。
2 
3 RabbitMQ自身:持久化、集群、普通模式、鏡像模式。
4 
5 RabbitMQ到消費者:basicAck機制、死信隊列、消息補償機制。

11.什么是RoutingKey路由鍵?

1 RoutingKey路由鍵是用來將客服端發送的消息通過綁定交換機路由給該交換機綁定的指定的隊列中。

12.Binding綁定?

1 將Exchange與若干個Queue綁定,綁定時設置RoutingKey用來將以后交換機接收的消息根據消息的RoutingKey路由到指定的Queue中。

13.交換器4種類型?

Fanout:廣播方式,綁定該類型交換機的隊列都將收到該交換機收到的所有消息。

Direct:點對點方式,只會將綁定關系RoutingKey與消息RoutingKey完全一致才會發送給該隊列。
Topic:通配符方式,通過
*(代表一個單詞,單詞之間.隔開)#(多個單詞)進行路由。
Headers:不處理路由鍵。而是根據發送的消息內容中的headers屬性進行匹配。在綁定Queue與Exchange時指定一組鍵值對;當消息發送到RabbitMQ時會取到該消息的headers與Exchange綁定
     時指定的鍵值對進行匹配;如果完全匹配則消息會路由到該隊列,否則不會路由到該隊列。headers屬性是一個鍵值對,可以是Hashtable,鍵值對的值可以是任何類型。而fanout,
     direct,
topic 的路由鍵都需要要字符串形式的。
     匹配規則x-match有下列兩種類型:
        x-match = all :表示所有的鍵值對都匹配才能接受到消息
        x-match = any :表示只要有鍵值對匹配就能接受到消息

14.生產者消息運轉?

1:與Broker的連接,創建信道(Channel)
2:創建EXchenge和Queue並設置屬性
3:將Exchange與Queue進行綁定
4:生產者將消息發送至Broker,其中包含交換機名,路由鍵等
5:指定路由器接收消息並根據路由鍵查找指定隊列
6:如果找到則將消息放入指定隊列,如果沒找到則將消息返回給生產者或者直接丟棄
7:關閉信道
8:關閉連接

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

1:消費者與Broker進行連接,開啟信道(Channel)
2:監聽Broker中指定的隊列,並設置回調函數
3:等待Broker相應並投遞隊列消息
4:消費者接收消息並響應ack
5:Broker從隊列中刪除消息
6:關閉信道
7:關閉連接

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

1 mandatory :true 返回消息給生產者。
2 mandatory: false 直接丟棄。

17.死信隊列?

1 當一個隊列中的消息過期,被拒收,或者隊列滿后再次收到消息,則該類消息會被發送到另一個交換機,則該交換機就成為死信交換機,與該交換機綁定的隊列為死信隊列。

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

1 消息被拒(Basic.Reject /Basic.Nack) 且 requeue = false2 消息TTL過期。
3 隊列滿了,無法再添加。

19.延遲隊列?

1 隊列中存儲消息后,不會立刻被消費者獲取到,而是等待指定時間后將消息發送給消費者。

20.優先級隊列?

優先級高的隊列會先被消費。
可以通過x-max-priority參數來實現。
當消費速度大於生產速度且Broker沒有堆積的情況下,優先級顯得沒有意義

21.事務機制?

1 RabbitMQ 客戶端中與事務機制相關的方法有三個:
2 
3     channel.txSelect  用於將當前的信道設置成事務模式。
4     channel . txCommit 用於提交事務 。
5     channel . txRollback 用於事務回滾,如果在事務提交執行之前由於 RabbitMQ 異常崩潰或者其他原因拋出異常,通過txRollback來回滾。

22.發送確認機制?

1 生產者把信道設置為confirm模式時,所有通過該信道發送的消息都會包含一個ID,當消息投遞到所有匹配隊列后,RabbitMQ會相應一個ACK給生產者並攜帶該消息的ID,這樣生產者就確認消息
2 到達指定位置。

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

1 推送Consume(實時監聽)
2 拉取Get(死循環發送請求,效率低)

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

1 channel .basicNack 
2 channel .basicReject

25.消息傳輸保證層級?

1 At most once:最多一次。消息可能會丟失,但不會重復傳輸。
2 
3 At least once:最少一次。消息絕不會丟失,但可能會重復傳輸。
4 
5 Exactly once:  恰好一次,每條消息肯定僅傳輸一次。

26.了解Virtual Host嗎?

1 每一個RabbitMQ服務器都能創建虛擬的消息服務器,也叫虛擬主機(virtual host),簡稱vhost。
2 
3 默認為“/”。

27.集群中的節點類型?

1 內存節點:ram,將變更寫入內存。
2 
3 磁盤節點:disc,磁盤寫入操作。
4 
5 RabbitMQ要求最少有一個磁盤節點。

28.隊列結構?

通常由以下兩部分組成

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

backing_queue:是消息存儲的具體形式和引擎,並向 rabbit amqqueue process提供相關的接口以供調用。

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

1 alpha: 消息內容(包括消息體、屬性和 headers) 和消息索引都存儲在內存中 。
2 
3 beta: 消息內容保存在磁盤中,消息索引保存在內存中。
4 
5 gamma: 消息內容保存在磁盤中,消息索引在磁盤和內存中都有 。
6 
7 delta: 消息內容和索引都在磁盤中 。

30.在何種場景下使用了消息中間件?

1 接口之間耦合比較嚴重
2 面對大流量並發時,容易被沖垮
3 存在性能問題

31.生產者如何將消息可靠投遞到MQ?

1 生產者把消息發送給MQ
2 MQ持久化消息后,會發送ack給生產者,如果由於網絡等原因生產者未能及時獲取到ack,則在等待時間超時后,生產者重新發送消息
3 生產者獲取到ack,認為已經發送成功

32 . MQ如何將消息可靠投遞到消費者?

1 1.MQ將消息push給Client(或Client來pull消息)
2 
3 2.Client得到消息並做完業務邏輯
4 
5 3.Client發送Ack消息給MQ,通知MQ刪除該消息,此處有可能因為網絡問題導致Ack失敗,那么Client會重復消息,這里就引出消費冪等的問題;
6 
7 4.MQ將已消費的消息刪除

33.如何保證RabbitMQ消息隊列的高可用?

RabbitMQ 有三種模式:單機模式,普通集群模式,鏡像集群模式。

單機模式:就是demo級別的,一般就是你本地啟動了玩玩兒的,沒人生產用單機模式

普通集群模式:意思就是在多台機器上啟動多個RabbitMQ實例,每個機器啟動一個。

鏡像集群模式:這種模式,才是所謂的RabbitMQ的高可用模式,跟普通集群模式不一樣的是,你創建的queue,無論元數據(元數據指RabbitMQ的配置數據)還是queue里的消息都會存在於多個實例
上,然后每次你寫消息到queue的時候,都會自動把消息到多個實例的queue里進行消息同步。

 34.消息冪等性實現原理?

使用全局 MessageID 判斷消費方使用同一個,解決冪等性問題。
或者使用業務邏輯保證唯一(比如訂單號碼)


通常判斷方式:
    可以給定每條消息一個唯一的MessageID,消費者每次消費消息后把MessageID存儲在Redis中,每次消費前去Redis中查詢有無記錄,如果有則不重復消費。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM