技術乾貨:RabbitMQ面試題及答案

陝西優就業發表於2020-01-17

RabbitMQ作為目前應用相當廣泛的訊息中介軟體,在企業級應用、微服務應用中充當著重要的角色,特別是在一些典型的應用場景以及業務模組中具有重要的作用。

比如業務服務模組解耦,非同步通訊,高併發限流,超時延遲處理等均有廣泛的應用!同時也是中高階Java工程師面試常問到的一個知識點,在這 陝西優就業整理了一些準備好答案的面試題,分享給大家!



推薦閱讀
【技術乾貨】 http://blog.itpub.net/69902581/viewspace-2672371/


一、什麼是RabbitMQ?

採用AMQP高階訊息佇列協議的一種訊息佇列技術,最大的特點就是消費並不需要確保提供方存在,實現了服務之間的高度解耦。

二、為什麼要使用RabbitMQ?

①在分散式系統下具備非同步,削峰,負載均衡等一系列高階功能;

②擁有持久化的機制,程式訊息,佇列中的資訊也可以儲存下來。

③實現消費者和生產者之間的解耦。

④對於高併發場景下,利用訊息佇列可以使得同步訪問變為序列訪問達到一定量的限流,利於資料庫的操作。

⑤可以使用訊息佇列達到非同步下單的效果,排隊中,後臺進行邏輯下單。

三、RabbitMQ的使用場景有哪些?

①跨系統的非同步通訊,所有需要非同步互動的地方都可以使用訊息佇列。就像我們除了打電話(同步)以外,還需要發簡訊,發電子郵件(非同步)的通訊方式。

②多個應用之間的耦合,由於訊息是平臺無關和語言無關的,而且語義上也不再是函式呼叫,因此更適合作為多個應用之間的松耦合的介面。基於訊息佇列的耦合,不需要傳送方和接收方同時線上。在企業應用整合(EAI)中,檔案傳輸,共享資料庫,訊息佇列,遠端過程呼叫都可以作為整合的方法。

③應用內的同步變非同步,比如訂單處理,就可以由前端應用將訂單資訊放到佇列,後端應用從佇列裡依次獲得訊息處理,高峰時的大量訂單可以積壓在佇列裡慢慢處理掉。由於同步通常意味著阻塞,而大量執行緒的阻塞會降低計算機的效能。

④訊息驅動的架構(EDA),系統分解為訊息佇列,和訊息製造者和訊息消費者,一個處理流程可以根據需要拆成多個階段(Stage),階段之間用佇列連線起來,前一個階段處理的結果放入佇列,後一個階段從佇列中獲取訊息繼續處理。

⑤應用需要更靈活的耦合方式,如釋出訂閱,比如可以指定路由規則。

⑥跨區域網,甚至跨城市的通訊(CDN行業),比如北京機房與廣州機房的應用程式的通訊。

四、RabbitMQ有哪些重要的角色?

RabbitMQ中重要的角色有:生產者、消費者和代理:

①生產者:訊息的建立者,負責建立和推送資料到訊息伺服器;

②消費者:訊息的接收方,用於處理資料和確認訊息;

③代理:就是RabbitMQ本身,用於扮演“快遞”的角色,本身不生產訊息,只是扮演“快遞”的角色。

五、如何確保訊息正確地傳送至RabbitMQ?如何確保訊息接收方消費了訊息?

1、傳送方確認模式

①將通道設定成confirm模式(傳送方確認模式),則所有在通道上釋出的訊息都會被指派一個唯一的ID。

②一旦訊息被投遞到目的佇列後,或者訊息被寫入磁碟後(可持久化的訊息),通道會傳送一個確認給生產者(包含訊息唯一 ID)。

③如果RabbitMQ發生內部錯誤從而導致訊息丟失,會傳送一條 nack(notacknowledged,未確認)訊息。

④傳送方確認模式是非同步的,生產者應用程式在等待確認的同時,可以繼續傳送訊息。當確認訊息到達生產者應用程式,生產者應用程式的回撥方法就會被觸發來處理確認訊息。

2、接收方確認機制

①消費者接收每一條訊息後都必須進行確認(訊息接收和訊息確認是兩個不同操作)。只有消費者確認了訊息,RabbitMQ 才能安全地把訊息從佇列中刪除。

②這裡並沒有用到超時機制,RabbitMQ僅透過Consumer的連線中斷來確認是否需要重新傳送訊息。也就是說,只要連線不中斷,RabbitMQ給了Consumer足夠長的時間來處理訊息。保證資料的最終一致性。

3、下面羅列幾種特殊情況

①如果消費者接收到訊息,在確認之前斷開了連線或取消訂閱,RabbitMQ會認為訊息沒有被分發,然後重新分發給下一個訂閱的消費者。(可能存在訊息重複消費的隱患,需要去重)

②如果消費者接收到訊息卻沒有確認訊息,連線也未斷開,則RabbitMQ認為該消費者繁忙,將不會給該消費者分發更多的訊息。

六、RabbitMQ怎麼避免訊息丟失?

①訊息持久化;

②ACK確認機制;

③設定叢集映象模式;

④訊息補償機制。

七、要保證訊息持久化成功的條件有哪些?

①宣告佇列必須設定持久化durable設定為 true。

②訊息推送投遞模式必須設定持久化,deliveryMode設定為2(持久)。

③訊息已經到達持久化交換器。

④訊息已經到達持久化佇列。

以上四個條件都滿足才能保證訊息持久化成功。

八、RabbitMQ持久化有什麼缺點?

持久化的缺地就是降低了伺服器的吞吐量,因為使用的是磁碟而非記憶體儲存,從而降低了吞吐量。可儘量使用ssd硬碟來緩解吞吐量的問題。

九、RabbitMQ 有幾種廣播型別?

三種廣播模式:

①fanout:所有bind到此exchange的queue都可以接收訊息(純廣播,繫結到RabbitMQ的接受者都能收到訊息);

②direct:透過routingKey和exchange決定的那個唯一的queue可以接收訊息;

③topic:所有符合routingKey(此時可以是一個表示式)的routingKey所bind的queue可以接收訊息;

十、RabbitMQ中vhost的作用是什麼?

vhost可以理解為虛擬broker ,即mini-RabbitMQ server。其內部均含有獨立的 queue、exchange和binding等,但最最重要的是,其擁有獨立的許可權系統,可以做到 vhost 範圍的使用者控制。當然,從RabbitMQ的全域性角度,vhost可以作為不同許可權隔離的手段(一個典型的例子就是不同的應用可以跑在不同的vhost中)。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69902581/viewspace-2673724/,如需轉載,請註明出處,否則將追究法律責任。

相關文章