求職面試 跳槽漲薪?看完記住立漲3k ! 2020最新Java常見面試題合集+答案詳解(十二)

圖靈學院諸葛發表於2020-10-08

2020最新Java常見面試題合集+答案詳解(十二)

持續更新Java相關資料。最近花了幾天諮詢大佬們最新的面試訊息,爭取蒐集到更全的面試資訊。大家想看前幾個合集的可以去我主頁查詢。

有些答案是我自己總結的,有些是在網上搜集整理的。看完這些面試不慌!大家如果有更多經驗可以在評論分享,有錯誤也歡迎大家指出,不吝賜教,謝謝~

RabbitMQ

 

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

 

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

 

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

 

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

 

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

 

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

 

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

 

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

 

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

 

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

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

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

 

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

 

  • ConnectionFactory(連線管理器):應用程式與Rabbit之間建立連線的管理器,程式程式碼中使用。

  • Channel(通道):訊息推送使用的通道。

  • Exchange(交換器):用於接受、分配訊息。

  • Queue(佇列):用於儲存生產者的訊息。

  • RoutingKey(路由鍵):用於把生成者的資料分配到交換器上。

  • BindingKey(繫結鍵):用於把交換器的訊息繫結到佇列上。

 

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

 

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

 

117. rabbitmq 的訊息是怎麼傳送的?

 

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

 

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

 

  • 提供了事務的功能。

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

 

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

 

  1. 訊息持久化

  2. ACK確認機制

  3. 設定叢集映象模式

  4. 訊息補償機制

 

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

 

  1. 宣告佇列必須設定持久化 durable 設定為 true.

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

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

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

 

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

 

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

 

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

 

122. rabbitmq 有幾種廣播型別?

 

三種廣播模式:

 

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

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

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

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

 

  1. 通過訊息過期後進入死信交換器,再由交換器轉發到延遲消費佇列,實現延遲功能;

  2. 使用 RabbitMQ-delayed-message-exchange 外掛實現延遲功能。

 

124. rabbitmq 叢集有什麼用?

 

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

 

  • 高可用:某個伺服器出現問題,整個 RabbitMQ 還可以繼續使用;

  • 高容量:叢集可以承載更多的訊息量。

 

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

 

  • 磁碟節點:訊息會儲存到磁碟。

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

 

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

 

  • 各節點之間使用“--link”連線,此屬性不能忽略。

  • 各節點使用的 erlang cookie 值必須相同,此值相當於“祕鑰”的功能,用於各節點的認證。

  • 整個叢集中必須包含一個磁碟節點。

 

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

 

不是,原因有以下兩個:

 

  1. 儲存空間的考慮:如果每個節點都擁有所有佇列的完全拷貝,這樣新增節點不但沒有新增儲存空間,反而增加了更多的冗餘資料;

  2. 效能的考慮:如果每條訊息都需要完整拷貝到每一個叢集節點,那新增節點並沒有提升處理訊息的能力,最多是保持和單節點相同的效能甚至是更糟。

 

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

 

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

 

  • 不能建立佇列

  • 不能建立交換器

  • 不能建立繫結

  • 不能新增使用者

  • 不能更改許可權

  • 不能新增和刪除叢集節點

 

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

 

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

 

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

最後

面試題內容到這裡就結束了,後續會有更多更新內容,希望對大家有幫助。

最後還想對你們說幾句心裡話,工作這麼多年,也幫別人面試過一些人。不管是站在面試官的角度看還是leader的視角,面試大廠除了面試技巧和經驗,過硬的技術和好的專案經驗也是自己的王牌和底氣。一線大廠核心技術分享

 我花了比較長的時間整理了一些學習資料,上面發的就是資料中的冰山一角,希望能幫到大家!點選一起學習 暗號:csdn

                         

  後續會分享更多純乾貨文章,希望能真正幫到你們。你們的支援就是我最大的動力!歡迎關注點贊啊!

                                                       

相關文章