分佈式通信之發佈訂閱

前言

上一篇文章介紹了分佈式通信中的遠程調用,其核心是在網絡服務層封裝了通信協議、序列化、傳輸等操作,讓用戶調用遠程服務如同進行本地調用一樣。
其實,這種方式就是通過網絡服務層的封裝實現了不同機器上不同進程之間的直接通信,因爲是直接通信,所以通過線程阻塞的方式實現同步調用比較容易,因此通常被用於同步調用。
比如,機器 1 上的進程 A 調用機器 2 上的進程 B,進程 A 被掛起,進程 B 開始執行,當進程 B 將值返回給 A 時,A 繼續執行。
雖然這種方式也可以用於異步通信,但因爲進程之間是直接交互的,所以當進程比較多時,會導致進程維護通信的複雜度非常高,且一個進程通信接口改變,與其通信的進程都會受到影響。
隨着業務和分佈式計算規模的逐漸增大和複雜化,遠程調用模型有點心有餘力而不足了,爲此出現了專門的異步通信模式,也就是消息發佈訂閱模式消息隊列模式

什麼是發佈訂閱?

由此可以看出,發佈訂閱的三要素是生產者、消費者和消息中心,生產者負責產生數據放到消息中心,消費者向消息中心訂閱自己感興趣的消息,當發佈者推送數據到消息中心後,消息中心根據消費者訂閱情況將相關數據推送給對應的訂閱者。

發佈訂閱的原理及應用

發佈訂閱的基本工作原理

在分佈式通信領域中,消息系統一般有兩種典型的模式。一種是點對點模式(P2P,Point to Point),另一種是發佈訂閱模式(Pub/Sub,Publish/Subscribe)。接下來,我們就一起看看這兩種模式,以幫助你深入理解發布訂閱模式的原理。

點對點模式

生產者將消息發送到消息中心,然後消費者從消息中心取出對應的消息進行消費。消息被消費後,消息中心不再存儲該消息,因此其他消費者無法再消費該消息。也就是說,點對點模式雖然支持多個消費者,但一個消息只能被一個消費者消費,不允許重複消費。

這種模式就好比,限定了每篇論文只能被一個用戶消費,比如現在有一篇分佈式相關的論文,這篇論文推送給學生 A 之後,論文網站就必須將其刪除或下架,也就是說其他用戶無法再獲取或閱讀該論文了。
在這裏插入圖片描述

發佈訂閱模式

生產者可以發送消息到消息中心,而消息中心通常以主題(Topic)進行劃分,每條消息都會有相應的主題,消息會被存儲到自己所屬的主題中,訂閱該主題的所有消費者均可獲得該消息進行消費。
在這裏插入圖片描述
比如圖中假設生產者 1 發佈一個 Topic 相關數據或消息,消費者 1~3 均訂閱了該 Topic 消息,則該消息會推送消費者 1~3,也就是說同一個消息被 3 個消費者消費了。

這種模式就好比,不同的方向代表不同的主題,比如分佈式領域代表一個主題,當會議方或出版社發佈分佈式相關的論文時,該論文會被存儲到論文網站的分佈式主題下,同時學生或老師也會根據自己感興趣的主題進行訂閱。如果學生 A 訂閱了分佈式主題,那麼當會議方或出版社發佈分佈式相關的論文後,會議網站會將這些論文推送給學生 A。

與點對點模式相比,發佈訂閱模式中一個消息可以被多個消費者進行消費,這也是和點對點模式的本質區別。

Kafka 發佈訂閱原理及工作機制

Kafka 是一種典型的發佈訂閱消息系統,其系統架構也是包括生產者、消費者和消息中心三部分。

  • 生產者(Producer)負責發佈消息到消息中心,比如電子論文的會議方或出版社;
  • 消費者(Consumer)向消息中心訂閱自己感興趣的消息,獲得數據後進行數據處理,比如訂閱電子論文的老師或學生;
  • 消息中心(Broker)負責存儲生產者發佈的消息和管理消費者訂閱信息,根據消費者訂閱信息,將消息推送給消費者,比如論文網站。

在Kafka 中,消息中心本質上就是一組服務器,也可以說是 Kafka 集羣
Kafka 的架構圖,如下所示:
在這裏插入圖片描述
可以看到,Kafka 中除了 Producer、Broker、Consumer 之外,還有一個 ZooKeeper 集羣:

  • Zookeeper 集羣用來協調和管理 Broker 和 Consumer,實現了 Broker 和 Consumer的解耦,併爲系統提供可靠性保證。
  • ZooKeeper 集羣可以看作是一個提供了分佈式服務協同能力的第三方組件,Consumer 和Broker 啓動時均會向ZooKeeper 進行註冊,由 ZooKeeper 進行統一管理和協調。
  • ZooKeeper中會存儲一些元數據信息,比如對於 Broker,會存儲主題對應哪些分區(Partition),每個分區的存儲位置等;對於Consumer,會存儲消費組(Consumer Group)中包含哪些 Consumer,每個 Consumer 會負責消費哪些分區等。

分區和消費組的原理和作用

從上面的介紹可以看出,Broker 負責存儲消息數據Consumer 負責消費數據若 Consumer 消費太慢,會導致 Broker 存儲溢出Broker 就會丟棄一部分消息。因此,Broker 和 Consumer 是 Kafka 的核心。接下來,我將帶你進一步瞭解 Kafka 中 Broker 和 Consumer 的關鍵技術,如下圖所示:
在這裏插入圖片描述

  • 首先看一下 Broker
    在 Kafka 中,爲了解決消息存儲的負載均衡和系統可靠性問題,所以引入了主題分區的概念。
    其中,主題是一個邏輯概念,指的是消息類型或數據類型,就好比電子論文案例所講的分佈式是一個主題。
    而分區是針對主題而言的,指的是一個主題的內容可以被劃分成多個集合,分佈在不同的 Broker 上,不同的 Broker 在不同的節點上。這裏的集合就是分區,其中同一個分區只屬於一個 Broker而分區的好處主要有兩點:

  • 實現負載均衡,避免單個 Broker 上的負載過高。比如,Topic 0 被分爲 Partiton-0、Partiton-1 和Partiton-2 三個分區,分別分佈在 Broker 0、Broker 1 和 Broker 2 上。這,就使得 Topic 0的消息可以分佈在這 3 個分區中,實現負載均衡。

  • 實現消息的備份,從而保證系統的高可靠。比如,Topic 1 包含兩個分區Partiton-0、Partiton-1,每個分區內容一致,分別存儲在 Broker 0 和 Broker 1 上,藉此實現了數據備份。

  • 接下來再看一下Consumer:
    Kafka 中的消費組,指的是多個消費者的一個集合。一個消費組中的消費者共同消費主題消息,並且主題中每個消息只可以由消費組中的某一個消費者進行消費。引入消費組的目的是什麼呢?我們知道,在消息過多的情況下,單個消費者消費能力有限時,會導致消費效率過低,從而導致 Broker 存儲溢出,丟棄一部分消息。Kafka 爲了解決這個問題,所以引入了消費組。

發佈訂閱實踐應用

假設在電商購物平臺中,用戶首先在訂單系統下單,下單後庫存系統會進行出貨,通知系統則負責通知用戶,整個流程可以用發佈訂閱的模式進行,如下圖所示:
在這裏插入圖片描述

  • 訂單系統對應發佈訂閱模式中的生產者,消息中心有個主題專門存放下單信息,每次用戶下單後,訂單系統會向該主題寫入數據;
  • 庫存系統和通知系統對應發佈訂閱模式中的消費者,它們會向消息中心訂閱下單信息相關的主題;
  • 訂單系統向消息中心發佈訂單信息後庫存系統和通知系統都會獲取到相應的下單信息,然後進行各自後續的操作,即庫存系統進行出貨,通知系統通過短信或郵件等方式通知用戶。

發佈訂閱模式的關鍵特徵:

  • 實現了系統解耦,易於維護。生產者 / 發佈者只負責消息的發佈,不需要知道訂閱者 / 消費者的數量,也不需要知道訂閱者 / 消費者獲取消息用來做什麼,而訂閱者 / 消費者也不需要知道什麼時候生產者 / 發佈者會發布消息。所以,生產者 / 發佈者和訂閱者 / 消費者互相獨立,進而實現了系統解耦,每個部分可以單獨維護,減少了因爲生產者和消費者的耦合引入的一些相互影響
  • 實現了異步執行,避免高負載。生產者 / 發佈者發佈消息到消息中心,當消息超過消息中心可以存儲的容量後,消息中心會丟棄掉超出的消息,這樣系統就不會因爲消息數量多而導致系統故障。

總結

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章