28 張圖剖析 kafka

基礎

Kafka 是一套流處理系統,可以讓後端服務輕鬆的相互溝通,是微服務架構中常用的組件。

生產者消費者:生產者即 Producer 向 Kafka 發送消息,消費者即 Consumer 監聽 Kafka 接收消息。

一個服務可以既是生產者又是消費者。

Topics 主題:Topic 是生產者發送消息的目標地址,是消費者的監聽目標。

一個服務可以監聽多個 Topic、也可以發送多個 Topic。

Kafka 中有一個【consumer-group(消費者組)】的概念。這是一組服務,扮演一個消費者組。

如果是消費者組接收消息,Kafka 會把一條消息路由到組中的某一個服務。

這樣有助於消息的負載均衡,也方便擴展消費者。

Topic 扮演一個消息的隊列。首先,一條消息發送到 Topic。

然後,這條消息被記錄和存儲在這個 Topic 中,不允許被修改。

接下來,消費者會從 Topic 中拉取消息進行消費。但是,這條消息並不會被刪除,會繼續保留在隊列中。

繼續發送消息。

像之前一樣,這條消息會發送給消費者、不允許被改動、一直呆在隊列中(消息在隊列中能呆多久,由 Kafka 的配置決定)

Partitions 分區:上面 Topic 的描述中,把 Topic 看做了一個隊列,實際上,一個 Topic 是由多個隊列組成的,被稱爲【Partition(分區)】。這樣可以便於 Topic 的擴展。

生產者發送消息的時候,這條消息會被路由到此 Topic 中的某一個 Partition。

消費者監聽的是所有分區。

生產者發送消息時,默認是面向 Topic 的,由 Topic 決定放在哪個 Partition,默認使用輪詢策略。

也可以配置 Topic,讓同類型的消息都在同一個 Partition。例如,處理用戶消息,可以讓某一個用戶所有消息都在一個 Partition(即消息根據用戶 ID 的 hash 值決定目標分區)。

例如,用戶 1 發送了 3 條消息:A、B、C,默認情況下,這 3 條消息是在不同的 Partition 中(如 P1、P2、P3)。在配置之後,可以確保用戶 1 的所有消息都發到同一個分區中(如 P1)。

這個功能有什麼用呢?這是爲了提供消息的【有序性】。消息在不同的 Partition 是不能保證有序的,只有一個 Partition 內的消息是有序的。

架構

Kafka 是集羣架構的,ZooKeeper 是重要組件。

ZooKeeper 管理者所有的 Topic 和 Partition。Topic 和 Partition 存儲在 Node 物理節點中,ZooKeeper 負責維護這些 Node。

例如,有 2 個 Topic,各自有 2 個 Partition。

這是邏輯上的形式,但在 Kafka 集羣中的實際存儲可能是這樣的:

Topic A 的 Partition #1 有 3 份,分佈在各個 Node 上。這樣可以增加 Kafka 的可靠性和系統彈性。3 個 Partition #1 中,ZooKeeper 會指定一個 Leader,負責接收生產者發來的消息。

其他 2 個 Partition #1 會作爲 Follower,Leader 接收到的消息會複製給 Follower。

這樣,每個 Partition 都含有了全量消息數據。

即使某個 Node 節點出現了故障,也不用擔心消息的損壞。Topic A 和 Topic B 的所有 Partition 分佈可能就是這樣的:

最後,感謝閱讀,希望對你有所幫助 😃

說明,本文所有圖片全部來自:https://timothystepro.medium.com/visualizing-kafka-20bc384803e7

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/q5qTW613ij3ow-BS1yvBVw