天天看點

阿裡架構師帶你RabbitMQ從0到1,含學習大綱,面試解析

作者:Java技術棧論壇

前言

消息隊列:

消息隊列,簡稱為MQ(Message Queue),是一個儲存消息的容器,本質上是一個隊列。隊列是一種先進先出的資料結構,我們可以簡單了解為:把要傳輸的資料放在隊列中。

我們一般把消息隊列作為應用間的通信方式,消息發送後可以立即傳回,由消息系統來確定消息的可靠傳遞。消息釋出者隻負責把消息釋出到 MQ 中,消息使用者隻管從 MQ 中取消息,雙方都不知道對方的存在,也不用管對方是如何處理。

為什麼要用消息隊列?

解耦,将各個應用解耦,隻需從消息中訂閱,防止一處變動多處跟随修改

異步,發送接收雙方不必同時線上,加快響應速度

削峰,并發量高峰期的時候,可以從消息隊列中稍後讀取消息,不會造成系統崩潰

消息隊列缺點:

可用性降低:系統外部依賴變多,容易崩潰

複雜性提高:需要考慮消息的一緻性問題、可靠傳輸問題、不被重複消費等問題

二、RabbitMQ 簡介

RabbitMQ是一套開源的消息隊列服務,基于 AMQP 的開源實作,由 Erlang 寫成。

AMQP :Advanced Message Queue,進階消息隊列協定。它是應用層協定的一個開放标準,為面向消息的中間件設計,基于此協定的用戶端與消息中間件可傳遞消息,并不受産品、開發語言等條件的限制。

通常消息隊列服務有三個概念: 發消息者、消息隊列、收消息者。

RabbitMQ 在這個基本概念之上, 多做了一層, 在發消息者和隊列之間, 加入了交換器 (Exchange)。這樣發消息者和消息隊列就沒有直接聯系,轉而變成發消息者把消息發給交換器,交換器根據排程政策再把消息轉發給消息隊列。

RabbitMQ 核心概念

RabbitMQ 整體上是一個生産者與消費者模型,主要負責接收、存儲和轉發消息。可以把消息傳遞的過程想象成:當你将一個包裹送到郵局,郵局會暫存并最終将郵件通過郵差送到收件人的手上,RabbitMQ就好比由郵局、郵箱和郵差組成的一個系統。從計算機術語層面來說,RabbitMQ 模型更像是一種交換機模型。

今天咱們就來一起學習一下連阿裡架構師都在推薦的《RabbitMQ實戰指南》以及關于RabbitMQ面試官們最喜歡問的面試題和解答。

另外,前兩天用XMind畫了一張導圖記錄RabbitMQ的學習大綱,這裡隻能用圖檔的形式,不過源檔案對個節點都有詳細的解釋,若是需要前面說的《RabbitMQ實戰指南》和面試解析筆記,可以找小編呀

阿裡架構師帶你RabbitMQ從0到1,含學習大綱,面試解析
每個章節都有小目錄,因為篇幅原因不能全部展開來看,有需要此份文檔進行學習的朋友,麻煩三連支援一下,私信小編【學習】即可~~~

正式步入今天的主題《RabbitMQ實戰指南》

共 有11 個章節,前後章節都有相關的聯系,基本上按照由淺入深、由表及裡的層次逐層進行講解。如果讀者對其中的某些内容已經掌握,可以選擇跳過而翻閱後面的内容,不過還是建議讀者按照先後順序進行閱讀。

阿裡架構師帶你RabbitMQ從0到1,含學習大綱,面試解析
  • 第 1 章 RabbitMQ 簡介 :針對消息中間件做一個摘要性介紹,包括什麼是消息中間件、消息中間件的作用及特點等。之後引入 RabbitMQ ,對其曆史和相關特點做一個簡要概述。本章最後介紹RabbitMQ 的安裝及生産、消費的使用示例。
  • 第 2 章 RabbitMQ 入門 :講述RabbitMQ的入門知識,包括生産者、消費者、隊列、交換器、路由鍵、綁定、連接配接及信道等基本術語。本章還闡述了RabbitMQ與 AMQP 協定的對應關系。
  • **第 3 章 用戶端開發向導 :**介紹 RabbitMQ 用戶端開發的簡單使用,按照個生命周期對連接配接、建立、生産、消費及關閉等幾個方面進行宏觀的介紹。
  • **第 4 章 RabbitMQ 進階 :**介紹資料可靠性的 些細節,井展示 RabbitMQ 的幾種己具備或衍生的進階特性,包括TTL、死信隊列、延遲隊列、優先級隊列、 RPC 等,這些功能在實際使用中可以讓某些應用的實作變得事半功倍。
  • **第 5 章 RabbitMQ 管理 :**圍繞 RabbitMQ 管理這個主題展開,包括多租戶、權限、使用者、應用和叢集管理、服務端狀态等方面,井且從側面講述 rabbitmqctl 工具和 rabbitmq_management 插件的使用。
  • **第 6 章 RabbitMQ 配置 :**講述 RabbitMQ 的配置,以此可以通過環境變量、配置檔案、運作時參數(和政策)等三種方式來定制化相應的服務。
  • **第 7 章 RabbitMQ 運維 :**圍繞運維層面展開論述,主要包括叢集搭建、日志檢視、故障恢複、叢集遷移、叢集監控這幾個方面。
  • 第 8 章 跨越叢集的界限 :講述 Federation Shovel 這兩個插件的使用、細節及相關原理 差別于第7章中叢集的部署方式, Federation Shovel 可以部署在廣域網中,為RabbitMQ 提供更廣泛的應用空間。
  • **第 9 章 RabbitMQ 高階 :**介紹 RabbitM 相關的一些原理,主要内容包括RabbitM 存儲機制、磁盤和記憶體告警、流控機制、鏡像隊列。了解這些實作的細節及原理十分必要,它們可以讓讀者在遇到問題時能夠透過現象看本質
  • **第 10 章 網絡分區 :**圍繞網絡分區進行展開,具體闡述網絡分區的意義,如何檢視和處理網絡分區,以及網絡分區所帶來的影響。
  • **第 11 章 RabbitMQ 擴充 :**探讨RabbitM 的兩個擴充内容:消息追蹤及負載均衡。消息追蹤可以有效地定位消息丢失的問題。負載均衡本身屬于運維層面,但是負載均衡一般需要借助第三方的工具-HAProxyLVS 等實作,故本書将其視為擴充内容。
阿裡架構師帶你RabbitMQ從0到1,含學習大綱,面試解析

RabbitMQ面試二十三連問

  • 問題一:RabbitMQ 中的 broker 是指什麼?cluster 又是指什麼?
  • 問題二:什麼是中繼資料?中繼資料分為哪些類型?包括哪些内容?與 cluster 相關的中繼資料有哪些?中繼資料是如何儲存的?中繼資料在 cluster 中是如何分布的?
  • 問題三:RAM node 和 disk node 的差別?
  • 問題四:RabbitMQ 上的一個 queue 中存放的 message 是否有數量限制?
  • 問題五:RabbitMQ 概念裡的 channel、exchange 和 queue 這些東東是邏輯概念,還是對應着程序實體?這些東東分别起什麼作用?
  • 問題六:vhost 是什麼?起什麼作用?
  • 問題七:在單 node 系統和多 node 構成的 cluster 系統中聲明 queue、exchange ,以及進行 binding 會有什麼不同?
  • 問題八:用戶端連接配接到 cluster 中的任意 node 上是否都能正常工作?
  • 問題九:cluster 中 node 的失效會對 consumer 産生什麼影響?若是在 cluster 中建立了mirrored queue ,這時 node 失效會對 consumer 産生什麼影響?
  • 問題十:能夠在地理上分開的不同資料中心使用 RabbitMQ cluster 麼?
  • 問題十一:為什麼 heavy RPC 的使用場景下不建議采用 disk node ?
  • 問題十二:向不存在的 exchange 發 publish 消息會發生什麼?向不存在的 queue 執行consume 動作會發生什麼?
  • 問題十三:routing_key 和 binding_key 的最大長度是多少?
  • 問題十四:RabbitMQ 允許發送的 message 最大可達多大?
  • 問題十五:什麼情況下 producer 不主動建立 queue 是安全的?
  • 問題十六:“dead letter”queue 的用途?
  • 問題十七:為什麼說保證 message 被可靠持久化的條件是 queue 和 exchange 具有durable 屬性,同時 message 具有 persistent 屬性才行?
  • 問題十八:什麼情況下會出現 blackholed 問題?
  • 問題十九:如何防止出現 blackholed 問題?
  • 問題二十:Consumer Cancellation Notification 機制用于什麼場景?
  • 問題二十一:Basic.Reject 的用法是什麼?
  • 問題二十二:為什麼不應該對所有的 message 都使用持久化機制?
  • 問題二十三:RabbitMQ 中的 cluster、mirrored queue,以及 warrens 機制分别用于解決什麼問題?存在哪些問題?
阿裡架構師帶你RabbitMQ從0到1,含學習大綱,面試解析

篇幅有限,無論是上面的RabbitMQ二十三連問還是下面的Java進階面試解析之消息隊列(面試官心裡分析+面試題剖析)都沒有把具體的解析答案附上,但是這些面試題及詳細的解答小編都有整理成冊!

Java進階面試解析之消息隊列(面試官心裡分析+面試題剖析)

  • 1.為什麼使用消息隊列 ?消息隊列有什麼優點和缺點?Kafka 、ActiveMQ 、RabbitMQ 、RocketMQ 都有什麼優點和缺點?
阿裡架構師帶你RabbitMQ從0到1,含學習大綱,面試解析
阿裡架構師帶你RabbitMQ從0到1,含學習大綱,面試解析
  • 2. 如何保證消息隊列的高可用?(RabbitMQ 的高可用性+Kafka 的高可用性)
阿裡架構師帶你RabbitMQ從0到1,含學習大綱,面試解析
  • 3. 如何保證消息不被重複消費 ?或者說 ,如何保證消息消費的幂等性 ?
阿裡架構師帶你RabbitMQ從0到1,含學習大綱,面試解析
  • 4. 如何保證消息的可靠性傳輸 ? 或者說 ,如何處理消息丢失的問題 ?
阿裡架構師帶你RabbitMQ從0到1,含學習大綱,面試解析
  • 5. 如何保證消息的順序性 ?
阿裡架構師帶你RabbitMQ從0到1,含學習大綱,面試解析
  • 6. 如何解決消息隊列的延時以及過期失效問題 ? 消息隊列滿了以後該怎麼處理 ?有幾百萬消息 持續積壓幾小時 ,說說怎麼解決 ?
阿裡架構師帶你RabbitMQ從0到1,含學習大綱,面試解析
  • 7. 如果讓你寫一個消息隊列 ,該如何進行架構設計 ?說一下你的思路 ?
阿裡架構師帶你RabbitMQ從0到1,含學習大綱,面試解析

撒花環節

RabbitMQ用于在分布式系統中存儲轉發消息,在易用性、擴充性、高可用性等方面表現不俗,是以發展到今天,被越來越多的人認可。是以RabbitMQ對于每一個想提升自己的Java程式員來說,都是一個必備的硬性條件,沒有理由不學,也沒有理由不把它學好。

今天咱們說的這個**《RabbitMQ實戰指南》、自己手繪的學習大綱(xmind檔案)、RabbitMQ面試二十三連問以及整理的Java進階面試必備的七大消息隊列題(面試官心裡分析+面試題剖析**),其實都是我們平時學習、面試必備的東西。

每個章節都有小目錄,因為篇幅原因不能全部展開來看,有需要此份文檔進行學習的朋友,麻煩三連支援一下,私信小編【學習】即可~~~