Java相關面試題總結+答案(八)
【RabbitMQ】
135. RabbitMQ 的使用場景有哪些?
- 搶購活動,削峰填谷,防止系統崩塌。
- 延遲信息處理,比如 10 分鐘之後給下單未付款的用戶發送郵件提醒。
- 解耦系統,對於新增的功能可以單獨寫模塊擴展,比如用戶確認評價之後,新增了給用戶返積分的功能,這個時候不用在業務代碼裏添加新增積分的功能,只需要把新增積分的接口訂閱確認評價的消息隊列即可,後面再添加任何功能只需要訂閱對應的消息隊列即可。
136. RabbitMQ 有哪些重要的角色?
RabbitMQ 中重要的角色有:生產者、消費者和代理:
-
- 生產者:消息的創建者,負責創建和推送數據到消息服務器;
- 消費者:消息的接收方,用於處理數據和確認消息;
- 代理:就是 RabbitMQ 本身,用於扮演“快遞”的角色,本身不生產消息,只是扮演“快遞”的角色。
- 生產者:消息的創建者,負責創建和推送數據到消息服務器;
137. RabbitMQ 有哪些重要的組件?
- ConnectionFactory(連接管理器):應用程序與Rabbit之間建立連接的管理器,程序代碼中使用。
- Channel(信道):消息推送使用的通道。
- Exchange(交換器):用於接受、分配消息。
- Queue(隊列):用於存儲生產者的消息。
- RoutingKey(路由鍵):用於把生成者的數據分配到交換器上。
- BindingKey(綁定鍵):用於把交換器的消息綁定到隊列上。
138. RabbitMQ 中 vhost 的作用是什麽?
vhost:每個 RabbitMQ 都能創建很多 vhost,我們稱之為虛擬主機,每個虛擬主機其實都是 mini 版的RabbitMQ,它擁有自己的隊列,交換器和綁定,擁有自己的權限機制。
139. RabbitMQ 的消息是怎麽發送的?
首先客戶端必須連接到 RabbitMQ 服務器才能發布和消費消息,客戶端和 rabbit server 之間會創建一個 tcp 連接,一旦 tcp 打開並通過了認證(認證就是你發送給 rabbit 服務器的用戶名和密碼),你的客戶端和 RabbitMQ 就創建了一條 amqp 信道(channel),信道是創建在“真實” tcp 上的虛擬連接,amqp 命令都是通過信道發送出去的,每個信道都會有一個唯一的 id,不論是發布消息,訂閱隊列都是通過這個信道完成的。
140. RabbitMQ 怎麽保證消息的穩定性?
- 提供了事務的功能。
- 通過將 channel 設置為 confirm(確認)模式。
141. RabbitMQ 怎麽避免消息丟失?
- 把消息持久化磁盤,保證服務器重啟消息不丟失。
- 每個集群中至少有一個物理磁盤,保證消息落入磁盤。
142. 要保證消息持久化成功的條件有哪些?
- 聲明隊列必須設置持久化 durable 設置為 true.
- 消息推送投遞模式必須設置持久化,deliveryMode 設置為 2(持久)。
- 消息已經到達持久化交換器。
- 消息已經到達持久化隊列。
以上四個條件都滿足才能保證消息持久化成功。
143. RabbitMQ 持久化有什麽缺點?
持久化的缺地就是降低了服務器的吞吐量,因為使用的是磁盤而非內存存儲,從而降低了吞吐量。可盡量使用 ssd 硬盤來緩解吞吐量的問題。
144. RabbitMQ 有幾種廣播類型?
- direct(默認方式):最基礎最簡單的模式,發送方把消息發送給訂閱方,如果有多個訂閱者,默認采取輪詢的方式進行消息發送。
- headers:與 direct 類似,只是性能很差,此類型幾乎用不到。
- fanout:分發模式,把消費分發給所有訂閱者。
- topic:匹配訂閱模式,使用正則匹配到消息隊列,能匹配到的都能接收到。
145. RabbitMQ 怎麽實現延遲消息隊列?
延遲隊列的實現有兩種方式:
-
- 通過消息過期後進入死信交換器,再由交換器轉發到延遲消費隊列,實現延遲功能;
- 使用 RabbitMQ-delayed-message-exchange 插件實現延遲功能。
146. RabbitMQ 集群有什麽用?
集群主要有以下兩個用途:
-
- 高可用:某個服務器出現問題,整個 RabbitMQ 還可以繼續使用;
- 高容量:集群可以承載更多的消息量。
147. RabbitMQ 節點的類型有哪些?
- 磁盤節點:消息會存儲到磁盤。
- 內存節點:消息都存儲在內存中,重啟服務器消息丟失,性能高於磁盤類型。
148. RabbitMQ 集群搭建需要註意哪些問題?
- 各節點之間使用“--link”連接,此屬性不能忽略。
- 各節點使用的 erlang cookie 值必須相同,此值相當於“秘鑰”的功能,用於各節點的認證。
- 整個集群中必須包含一個磁盤節點。
149. RabbitMQ 每個節點是其他節點的完整拷貝嗎?為什麽?
不是,原因有以下兩個:
-
- 存儲空間的考慮:如果每個節點都擁有所有隊列的完全拷貝,這樣新增節點不但沒有新增存儲空間,反而增加了更多的冗余數據;
- 性能的考慮:如果每條消息都需要完整拷貝到每一個集群節點,那新增節點並沒有提升處理消息的能力,最多是保持和單節點相同的性能甚至是更糟。
150. RabbitMQ 集群中唯一一個磁盤節點崩潰了會發生什麽情況?
如果唯一磁盤的磁盤節點崩潰了,不能進行以下操作:
-
- 不能創建隊列
- 不能創建交換器
- 不能創建綁定
- 不能添加用戶
- 不能更改權限
- 不能添加和刪除集群節點
唯一磁盤節點崩潰了,集群是可以保持運行的,但你不能更改任何東西。
151. RabbitMQ 對集群節點停止順序有要求嗎?
RabbitMQ 對集群的停止的順序是有要求的,應該先關閉內存節點,最後再關閉磁盤節點。如果順序恰好相反的話,可能會造成消息的丟失。
【Kafka】
152. kafka 可以脫離 zookeeper 單獨使用嗎?為什麽?
kafka 不能脫離 zookeeper 單獨使用,因為 kafka 使用 zookeeper 管理和協調 kafka 的節點服務器。
153. kafka 有幾種數據保留的策略?
kafka 有兩種數據保存策略:按照過期時間保留和按照存儲的消息大小保留。
154. kafka 同時設置了 7 天和 10G 清除數據,到第五天的時候消息達到了 10G,這個時候 kafka 將如何處理?
這個時候 kafka 會執行數據清除工作,時間和大小不論那個滿足條件,都會清空數據。
155. 什麽情況會導致 kafka 運行變慢?
- cpu 性能瓶頸
- 磁盤讀寫瓶頸
- 網絡瓶頸
156. 使用 kafka 集群需要註意什麽?
- 集群的數量不是越多越好,最好不要超過 7 個,因為節點越多,消息復制需要的時間就越長,整個群組的吞吐量就越低。
- 集群數量最好是單數,因為超過一半故障集群就不能用了,設置為單數容錯率更高。
【Zookeeper】
157. zookeeper 是什麽?
zookeeper 是一個分布式的,開放源碼的分布式應用程序協調服務,是 google chubby 的開源實現,是 hadoop 和 hbase 的重要組件。它是一個為分布式應用提供一致性服務的軟件,提供的功能包括:配置維護、域名服務、分布式同步、組服務等。
158. zookeeper 都有哪些功能?
- 集群管理:監控節點存活狀態、運行請求等。
- 主節點選舉:主節點掛掉了之後可以從備用的節點開始新一輪選主,主節點選舉說的就是這個選舉的過程,使用 zookeeper 可以協助完成這個過程。
- 分布式鎖:zookeeper 提供兩種鎖:獨占鎖、共享鎖。獨占鎖即一次只能有一個線程使用資源,共享鎖是讀鎖共享,讀寫互斥,即可以有多線線程同時讀同一個資源,如果要使用寫鎖也只能有一個線程使用。zookeeper可以對分布式鎖進行控制。
- 命名服務:在分布式系統中,通過使用命名服務,客戶端應用能夠根據指定名字來獲取資源或服務的地址,提供者等信息。
159. zookeeper 有幾種部署模式?
zookeeper 有三種部署模式:
-
- 單機部署:一臺集群上運行;
- 集群部署:多臺集群運行;
- 偽集群部署:一臺集群啟動多個 zookeeper 實例運行。
160. zookeeper 怎麽保證主從節點的狀態同步?
zookeeper 的核心是原子廣播,這個機制保證了各個 server 之間的同步。實現這個機制的協議叫做 zab 協議。 zab 協議有兩種模式,分別是恢復模式(選主)和廣播模式(同步)。當服務啟動或者在領導者崩潰後,zab 就進入了恢復模式,當領導者被選舉出來,且大多數 server 完成了和 leader 的狀態同步以後,恢復模式就結束了。狀態同步保證了 leader 和 server 具有相同的系統狀態。
161. 集群中為什麽要有主節點?
在分布式環境中,有些業務邏輯只需要集群中的某一臺機器進行執行,其他的機器可以共享這個結果,這樣可以大大減少重復計算,提高性能,所以就需要主節點。
162. 集群中有 3 臺服務器,其中一個節點宕機,這個時候 zookeeper 還可以使用嗎?
可以繼續使用,單數服務器只要沒超過一半的服務器宕機就可以繼續使用。
163. 說一下 zookeeper 的通知機制?
客戶端端會對某個 znode 建立一個 watcher 事件,當該 znode 發生變化時,這些客戶端會收到 zookeeper 的通知,然後客戶端可以根據 znode 變化來做出業務上的改變。
Java相關面試題總結+答案(八)