【每日3分鐘技術乾貨 | 面試題+答案 | RabbitMQ篇(一)】

1. RabbitMQ 的使用場景有哪些?程序員

  • 搶購活動,削峯填谷,防止系統崩塌。面試

  • 延遲信息處理,好比 10 分鐘以後給下單未付款的用戶發送郵件提醒。sql

  • 解耦系統,對於新增的功能能夠單獨寫模塊擴展,好比用戶確認評價以後,新增了給用戶返積分的功能,這個時候不用在業務代碼裏添加新增積分的功能,只須要把新增積分的接口訂閱確認評價的消息隊列便可,後面再添加任何功能只須要訂閱對應的消息隊列便可。bash

2. RabbitMQ 有哪些重要的角色?服務器

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

  • 生產者:消息的建立者,負責建立和推送數據到消息服務器;jvm

  • 消費者:消息的接收方,用於處理數據和確認消息;tcp

  • 代理:就是 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 對集羣的中止的順序是有要求的,應該先關閉內存節點,最後再關閉磁盤節點。若是順序剛好相反的話,可能會形成消息的丟失。

結語

就以這段話自勉、共勉吧。越努力、越幸運,若是你不是官二代、富二代、紅二代,那麼請記住:勤奮纔是改變你命運的惟一捷徑。

歡迎在留言區留下你的觀點,一塊兒討論提升。若是今天的文章讓你有新的啓發,學習能力的提高上有新的認識,歡迎轉發分享給更多人。


歡迎各位讀者加入程序員知識碼頭技術羣,在公衆號後臺回覆「加羣」便可。

猜你還想看

1.面試總問的jvm調優究竟是要幹什麼?

2.程序員應該有什麼樣的職業規劃?值得思考一下!

3.每日3分鐘技術乾貨 | 面試題+答案 | jvm篇(一)

4.每日3分鐘技術乾貨 | 面試題+答案 | jvm篇(二)

5.每日3分鐘技術乾貨 | 面試題+答案 | Redis篇(一)

6.每日3分鐘技術乾貨 | 面試題+答案 | Mysql篇(一)


關注「程序員知識碼頭」,收看更多精彩內容複製代碼
相關文章
相關標籤/搜索