Java面試不通過?RabbitMQ你熟悉了嗎?

2020-08-09 19:54:08

1.rabbitmq 的使用場景有哪些?

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

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

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

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

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

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

第二種回答:

  • 搶購活動,削峯填谷,防止系統崩塌。
  • 延遲資訊處理,比如 10 分鐘之後給下單未付款的使用者發送郵件提醒。
  • 解耦系統,對於新增的功能可以單獨寫模組擴充套件,比如使用者確認評價之後,新增了給使用者返積分的功能,這個時候不用在業務程式碼裡新增新增積分的功能,只需要把新增積分的介面訂閱確認評價的訊息佇列即可,後面再新增任何功能只需要訂閱對應的訊息佇列即可。

2.rabbitmq 有哪些重要的角色?

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

  • 生產者:訊息的建立者,負責建立和推播數據到訊息伺服器;
  • 消費者:訊息的接收方,用於處理數據和確認訊息;
  • 代理:就是 RabbitMQ 本身,用於扮演「快遞」的角色,本身不生產訊息,只是扮演「快遞」的角色。

3.rabbitmq 有哪些重要的元件?

  • ConnectionFactory(連線管理器):應用程式與Rabbit之間建立連線的管理器,程式程式碼中使用。
  • Channel(通道):訊息推播使用的通道。
  • Exchange(交換器):用於接受、分配訊息。
  • Queue(佇列):用於儲存生產者的訊息。
  • RoutingKey(路由鍵):用於把生成者的數據分配到交換器上。
  • BindingKey(系結鍵):用於把交換器的訊息系結到佇列上。

4.rabbitmq 中 vhost 的作用是什麼?

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

第二種回答:

vhost:每個 RabbitMQ 都能建立很多 vhost,我們稱之爲虛擬主機,每個虛擬主機其實都是 mini 版的RabbitMQ,它擁有自己的佇列,交換器和系結,擁有自己的許可權機制 機製。

5.rabbitmq 的訊息是怎麼發送的?

首先用戶端必須連線到 RabbitMQ 伺服器才能 纔能發佈和消費訊息,用戶端和 rabbit server 之間會建立一個 tcp 連線,一旦 tcp 開啓並通過了認證(認證就是你發送給 rabbit 伺服器的使用者名稱和密碼),你的用戶端和 RabbitMQ 就建立了一條 amqp 通道(channel),通道是建立在「真實」 tcp 上的虛擬連線,amqp 命令都是通過通道發送出去的,每個通道都會有一個唯一的 id,不論是發佈訊息,訂閱佇列都是通過這個通道完成的。

6.rabbitmq 怎麼保證訊息的穩定性?

提供了事務的功能。

通過將 channel 設定爲 confirm(確認)模式。

7.rabbitmq 怎麼避免訊息丟失?

  • 訊息持久化
  • ACK確認機制 機製
  • 設定叢集映象模式
  • 訊息補償機制 機製

第二種回答:

把訊息持久化磁碟,保證伺服器重新啓動訊息不丟失。

每個叢集中至少有一個物理磁碟,保證訊息落入磁碟。

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

  • 宣告佇列必須設定持久化 durable 設定爲 true.
  • 訊息推播投遞模式必須設定持久化,deliveryMode 設定爲 2(持久)。
  • 訊息已經到達持久化交換器。
  • 訊息已經到達持久化佇列。

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

9.rabbitmq 持久化有什麼缺點?

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

10.rabbitmq 有幾種廣播型別?

三種廣播模式:

  • fanout: 所有bind到此exchange的queue都可以接收訊息(純廣播,系結到RabbitMQ的接受者都能收到訊息);
  • direct: 通過routingKey和exchange決定的那個唯一的queue可以接收訊息;
  • topic:所有符合routingKey(此時可以是一個表達式)的routingKey所bind的queue可以接收訊息;

第二種回答:

  • direct(預設方式):最基礎最簡單的模式,發送方把訊息發送給訂閱方,如果有多個訂閱者,預設採取輪詢的方式進行訊息發送。
  • headers:與 direct 類似,只是效能很差,此型別幾乎用不到。
  • fanout:分發模式,把消費分發給所有訂閱者。
  • topic:匹配訂閱模式,使用正則匹配到訊息佇列,能匹配到的都能接收到。

11.rabbitmq 怎麼實現延遲訊息佇列?

  • 通過訊息過期後進入死信交換器,再由交換器轉發到延遲消費佇列,實現延遲功能;
  • 使用 RabbitMQ-delayed-message-exchange 外掛實現延遲功能。

12.rabbitmq 叢集有什麼用?

叢集主要有以下兩個用途:

  • 高可用:某個伺服器出現問題,整個 RabbitMQ 還可以繼續使用;
  • 高容量:叢集可以承載更多的訊息量。

13.rabbitmq 節點的型別有哪些?

  • 磁碟節點:訊息會儲存到磁碟。
  • 記憶體節點:訊息都儲存在記憶體中,重新啓動伺服器訊息丟失,效能高於磁碟型別。

14.rabbitmq 叢集搭建需要注意哪些問題?

  • 各節點之間使用「–link」連線,此屬性不能忽略。
  • 各節點使用的 erlang cookie 值必須相同,此值相當於「祕鑰」的功能,用於各節點的認證。
  • 整個叢集中必須包含一個磁碟節點。

15.rabbitmq 每個節點是其他節點的完整拷貝嗎?爲什麼?

不是,原因有以下兩個:

  • 儲存空間的考慮:如果每個節點都擁有所有佇列的完全拷貝,這樣新增節點不但沒有新增儲存空間,反而增加了更多的冗餘數據;
  • 效能的考慮:如果每條訊息都需要完整拷貝到每一個叢集節點,那新增節點並沒有提升處理訊息的能力,最多是保持和單節點相同的效能甚至是更糟。

16.rabbitmq 叢集中唯一一個磁碟節點崩潰了會發生什麼情況?

如果唯一磁碟的磁碟節點崩潰了,不能進行以下操作:

  • 不能建立佇列
  • 不能建立交換器
  • 不能建立系結
  • 不能新增使用者
  • 不能更改許可權
  • 不能新增和刪除叢集節點

唯一磁碟節點崩潰了,叢集是可以保持執行的,但你不能更改任何東西。

17.rabbitmq 對叢集節點停止順序有要求嗎?

RabbitMQ 對叢集的停止的順序是有要求的,應該先關閉記憶體節點,最後再關閉磁碟節點。如果順序恰好相反的話,可能會造成訊息的丟失。

最後

關注公衆號:程式設計師麥冬,回覆 回復888,領取2020最新Java面試題手冊(200多頁PDF文件)。