天天看點

深入了解MQ:高可用架構分析

作者:JAVA後端架構
深入了解MQ:高可用架構分析

1 介紹

消息中間件是指在分布式系統中完成消息的發送和接收的基礎軟體。

消息中間件也可以稱消息隊列(Message Queue / MQ),網際網路場景中經常使用消息中間件進行消息路由、訂閱釋出、異步處理等操作,來緩解系統的壓力。

引入消息隊列主要是為了解決如下問題的:

1、解耦 :如訂單系統,可以通過消息隊列把削減庫存的工作交給庫存系統去處理,而不用等實時響應。

2、執行有序性:先進先出原理,按照進入消息隊列的順序處理業務事件。

3、消息路由 :按照不同的規則,将隊列中消息發送到不同的業務服務中。

4、異步處理 :将一些無需實時響應結果的計算放到異步中,提升系統的吞吐率。

5、削峰 :将峰值期間的操作削減,比如整個操作流程包含12個步驟,後11個步驟非強關注結果的資料,可以放在消息隊列中。

既然本身就是為了解決大流量場面而設計的,那他自身的穩定性、健壯性就顯的無比重要,下面我們來看看消息隊列怎麼去保證可用性的。

2 消息隊列的基本構成

分析高可用特性前先複習下消息隊列的基本元件,無論是哪一種類型的消息隊列,基本都包含以下構成:

  • Broker:消息伺服器,以服務的形式運作在server端,給各個業務系統提供核心消息資料的中轉服務。
  • Producer:消息生産者,業務的發起方,負責生産消息傳輸給broker。
  • Consumer:消息消費者,業務的處理方,負責從broker擷取消息并進行業務邏輯處理
  • Topic:主題子產品,釋出/訂閱模式下的消息統一彙集地,不同生産者向topic發送消息,由MQ伺服器分發到不同的訂閱者,實作消息的廣播
  • Queue:隊列,PTP模式下,特定生産者向特定queue發送消息,消費者訂閱特定的queue完成指定消息的接收。
  • Message:消息體,根據不同通信協定定義的固定格式進行編碼的資料包,來封裝業務資料,實作消息的傳輸。
深入了解MQ:高可用架構分析

上圖中以kafka為例子,這是典型的叢集模式,<font color="#ff0000">Kafka通過Zookeeper管理叢集配置,選舉leader,以及在Consumer Group發生變化時進行rebalance。Producer使用push模式将消息釋出到broker,Consumer使用pull模式從broker訂閱并消費消息</font>。

  • producer 負責生産消息
  • consumer 負責消費消息
  • broker 消息伺服器,提供消息核心的處理工作
  • zookeeper 用于生産者和消費者的注冊與發現

3 高可用性架構保證

了解了一個消息隊列的構成之後,我們來看看這種結構是怎麼保障高可用性的。

首先,高可用是指系統的出錯機率和無故障運作時長,從消息隊列角度出發,至少要保證一下幾點:

  • 低消息丢失率:消息可靠性也是衡量消息中間件好壞的一個關鍵因素,尤其是在金融支付領域,消息可靠性尤為重要。
  • 低故障率:消息中間件的可用性是指無故障運作的時間百分比,通常用幾個 9 來衡量,如 99.99% 就是一個不錯的名額。
  • 多副本容錯能力:一般會要求多副本及強一緻性,多副本可以保證在 master 節點當機異常之後可以提升 slave 作為新的 master 而繼續提供服務來保障可用性。

3.1 RocketMQ

以為RocketMQ為例,叢集模式如下:

  • 多master 模式
  • 多master多slave異步複制模式-
  • 多 master多slave同步雙寫模式。
  • Name Service 叢集: RocketMQ 的 "中央大腦 " , RocketMQ 的服務注冊中心,叢集模式確定它的可用性。
  • Produer 叢集
  • Consumer 叢集:避免單例的消費服務故障導緻消息堆積。

    多master 多slave模式部署架構圖:

Producer 與 NameServer叢集中的其中一個節點(随機或者RR選擇)建立長連接配接,定期從 NameServer 擷取 Topic 路由資訊,既可以從 Broker Master 訂閱消息,也可以從 Broker Slave 訂閱消息。

3.2 Kafka

Kafka叢集中包含如下組成部分:

  • 幾個消息生産者Producer(可以是業務的Web程式、定時任務服務,其他下遊服務的請求等)
  • 一個broker組(Kafka支援橫向擴充,一般來說broker數量越多,叢集吞吐率越高)
  • 一個消費組 Consumer Group,在資源充足的情況下,消費者越多,消費效率越高,性能也就越好
  • 一個Zookeeper叢集:保證消費者和生産者的注冊和訂閱,避免業務之間的耦合,也提高了可用性。

    兩個關鍵點:

  1. Kafka通過Zookeeper管理叢集配置,選舉leader,以及在Consumer Group發生變化時進行rebalance。
  2. Producer使用push模式将消息釋出到broker,Consumer使用pull模式從broker訂閱并消費消息。

4 總結

上面介紹了履歷高可用消息隊列架構的條件,以及RocketMQ和Kafka實作方案。具體高可用性特性方面(如 消息順序性保障、消息幂等性保障、消息安全性保障、消息事務性保障),我們會在後面的章節中詳細的介紹。

為幫助開發者們提升面試技能、有機會入職BATJ等大廠公司,特别制作了這個專輯——這一次整體放出。

大緻内容包括了: Java 集合、JVM、多線程、并發程式設計、設計模式、Spring全家桶、Java、MyBatis、ZooKeeper、Dubbo、Elasticsearch、Memcached、MongoDB、Redis、MySQL、RabbitMQ、Kafka、Linux、Netty、Tomcat等大廠面試題等、等技術棧!

深入了解MQ:高可用架構分析

歡迎大家關注公衆号【Java爛豬皮】,回複【666】,擷取以上最新Java後端架構VIP學習資料以及視訊學習教程,然後一起學習,一文在手,面試我有。

每一個專欄都是大家非常關心,和非常有價值的話題,如果我的文章對你有所幫助,還請幫忙點贊、好評、轉發一下,你的支援會激勵我輸出更高品質的文章,非常感謝!

深入了解MQ:高可用架構分析

繼續閱讀