MQ系列9:高可用架構分析

Brand發表於2023-01-04

MQ系列1:訊息中介軟體執行原理
MQ系列2:訊息中介軟體的技術選型
MQ系列3:RocketMQ 架構分析
MQ系列4:NameServer 原理解析
MQ系列5:RocketMQ訊息的傳送模式
MQ系列6:訊息的消費
MQ系列7:訊息通訊,追求極致效能
MQ系列8:資料儲存,訊息佇列的高可用保障

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:訊息體,根據不同通訊協議定義的固定格式進行編碼的資料包,來封裝業務資料,實現訊息的傳輸。

image

上圖中以kafka為例子,這是典型的叢集模式,Kafka透過Zookeeper管理叢集配置,選舉leader,以及在Consumer Group發生變化時進行rebalance。Producer使用push模式將訊息釋出到broker,Consumer使用pull模式從broker訂閱並消費訊息

  • 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模式部署架構圖:
    image

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

3.2 Kafka

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

  • 幾個訊息生產者Producer(可以是業務的Web程式、定時任務服務,其他下游服務的請求等)
  • 一個broker組(Kafka支援橫向擴充套件,一般來說broker數量越多,叢集吞吐率越高)
  • 一個消費組 Consumer Group,在資源充足的情況下,消費者越多,消費效率越高,效能也就越好
  • 一個Zookeeper叢集:保證消費者和生產者的註冊和訂閱,避免業務之間的耦合,也提高了可用性。
    image
    兩個關鍵點:
  1. Kafka透過Zookeeper管理叢集配置,選舉leader,以及在Consumer Group發生變化時進行rebalance。
  2. Producer使用push模式將訊息釋出到broker,Consumer使用pull模式從broker訂閱並消費訊息。

4 總結

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

相關文章