RabbitMQ
1. RabbitMQ的使用場景有哪些?
搶購活動,削峰填谷,防止系統崩塌。
延遲資訊處理,比如10分鐘之後給下單未付款的使用者發送郵件提醒。解耦系統,對于新增的功能可以單獨寫子產品擴充,比如使用者确認評價之後,新增了給使用者返積分的功能,這個時候不用在業務代碼裡添加新增積分的功能,隻需要把新增積分的接口訂閱确認評價的消息隊列即可,後面再添加任何功能隻需要訂閱對應的消息隊列即可。
2. RabbitMQ有哪些重要的角色?
RabbitMQ中重要的角色有:生産者、消費者和代理:
[圖檔上傳失敗...(image-40f1e0-1604821335945)]
生産者:消息的建立者,負責建立和推送資料到消息伺服器;
消費者:消息的接收方,用于處理資料和确認消息;
代理:就是RabbitMQ本身,用于扮演“快遞”的角色,本身不生産消息,隻是扮演“快遞”的角色。
3. RabbitMQ有哪些重要的元件?
ConnectionFactory(連接配接管理器):應用程式與Rabbit之間建立連接配接的管理器,程式代碼中使用。
Channel(信道):消息推送使用的通道。
Exchange(交換器):用于接受、配置設定消息。
Queue(隊列):用于存儲生産者的消息。
RoutingKey(路由鍵):用于把生成者的資料配置設定到交換器上。
BindingKey(綁定鍵):用于把交換器的消息綁定到隊列上。
4. RabbitMQ中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怎麼避免消息丢失?
把消息持久化磁盤,保證伺服器重新開機消息不丢失。
每個叢集中至少有一個實體磁盤,保證消息落入磁盤。
8.要保證消息持久化成功的條件有哪些?
聲明隊列必須設定持久化durable設定為true.
消息推送投遞模式必須設定持久化,deliveryMode設定為2(持久)。
消息已經到達持久化交換器。
消息已經到達持久化隊列。
以上四個條件都滿足才能保證消息持久化成功。
9. RabbitMQ持久化有什麼缺點?
持久化的缺地就是降低了伺服器的吞吐量,因為使用的是磁盤而非記憶體存儲,進而降低了吞吐量。可盡量使用ssd硬碟來緩解吞吐量的問題。
10. RabbitMQ有幾種廣播類型?
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對叢集的停止的順序是有要求的,應該先關閉記憶體節點,最後再關閉磁盤節點。如果順序恰好相反的話,可能會造成消息的丢失。
Kafka
1. kafka可以脫離zookeeper單獨使用嗎?為什麼?
kafka不能脫離zookeeper單獨使用,因為kafka使用zookeeper管理和協調kafka的節點伺服器。
2. kafka有幾種資料保留的政策?
kafka有兩種資料儲存政策:按照過期時間保留和按照存儲的消息大小保留。
3. kafka同時設定了7天和10G清除資料,到第五天的時候消息達到了10G,這個時候kafka将如何處理?
這個時候kafka會執行資料清除工作,時間和大小不論那個滿足條件,都會清空資料。
4.什麼情況會導緻kafka運作變慢?
cpu性能瓶頸磁盤讀寫瓶頸網絡瓶頸
5.使用kafka叢集需要注意什麼?
叢集的數量不是越多越好,最好不要超過7個,因為節點越多,消息複制需要的時間就越長,整個群組的吞吐量就越低。
叢集數量最好是單數,因為超過一半故障叢集就不能用了,設定為單數容錯率更高。
ZooKeeper
1. zookeeper是什麼?
zookeeper是一個分布式的,開放源碼的分布式應用程式協調服務,是google chubby的開源實作,是hadoop和hbase的重要元件。它是一個為分布式應用提供一緻性服務的軟體,提供的功能包括:配置維護、域名服務、分布式同步、組服務等。
2. zookeeper都有哪些功能?
叢集管理:監控節點存活狀态、運作請求等。
主節點選舉:主節點挂掉了之後可以從備用的節點開始新一輪選主,主節點選舉說的就是這個選舉的過程,使用zookeeper可以協助完成這個過程。
分布式鎖:zookeeper提供兩種鎖:獨占鎖、共享鎖。獨占鎖即一次隻能有一個線程使用資源,共享鎖是讀鎖共享,讀寫互斥,即可以有多線線程同時讀同一個資源,如果要使用寫鎖也隻能有一個線程使用。zookeeper可以對分布式鎖進行控制。
命名服務:在分布式系統中,通過使用命名服務,用戶端應用能夠根據指定名字來擷取資源或服務的位址,提供者等資訊。
3. zookeeper有幾種部署模式?
zookeeper有三種部署模式:
單機部署:一台叢集上運作;
叢集部署:多台叢集運作;
僞叢集部署:一台叢集啟動多個zookeeper執行個體運作。
4. zookeeper怎麼保證主從節點的狀态同步?
zookeeper的核心是原子廣播,這個機制保證了各個server之間的同步。實作這個機制的協定叫做zab協定。
zab協定有兩種模式,分别是恢複模式(選主)和廣播模式(同步)。當服務啟動或者在上司者崩潰後,zab就進入了恢複模式,當上司者被選舉出來,且大多數server完成了和leader的狀态同步以後,恢複模式就結束了。狀态同步保證了leader和server具有相同的系統狀态。
5.叢集中為什麼要有主節點?
在分布式環境中,有些業務邏輯隻需要叢集中的某一台機器進行執行,其他的機器可以共享這個結果,這樣可以大大減少重複計算,提高性能,是以就需要主節點。
6.叢集中有3台伺服器,其中一個節點當機,這個時候zookeeper還可以使用嗎?
可以繼續使用,單數伺服器隻要沒超過一半的伺服器當機就可以繼續使用。
7.說一下zookeeper的通知機制?
用戶端端會對某個znode建立一個watcher事件,當該znode發生變化時,這些用戶端會收到zookeeper的通知,然後用戶端可以根據znode變化來做出業務上的改變。
總結
總結了2020面試題,這份面試題的包含的子產品分為19個子產品,分别是: Java 基礎、容器、多線程、反射、對象拷貝、Java Web 、異常、網絡、設計模式、Spring/Spring MVC、Spring Boot/Spring Cloud、Hibernate、MyBatis、RabbitMQ、Kafka、Zookeeper、MySQL、Redis、JVM 。關注公種浩:程式員追風,回複【009】擷取上述資料。