iT邦幫忙

2025 iThome 鐵人賽

DAY 17
0
自我挑戰組

雲端與資料平台實戰:從抽象概念到落地技術系列 第 17

Day17 Kafka 資料流與設計思路

  • 分享至 

  • xImage
  •  

在過去三天的內容裡,我們已經逐步拆解了 Kafka 的核心架構與效能來源。但你或許會注意到,我始終沒有直接談論 資料流(Data Flow) 與 Partition

這並非疏忽,而是刻意安排。因為在真正理解 Kafka 為何高效之前,如果過早深入資料流與分片等細節,容易將注意力放在分配策略上,甚至誤以為效能主要取決於硬體配置。

我自己在初學 Kafka 時,也曾執著於 Partition Leader 究竟落在哪台 Broker,誤以為效能取決於底層配置。但實務經驗告訴我:這樣的思路只會讓人困在枝節。真正影響架構設計的,並非 Broker 的配置,而是對 資料流模型 的正確認識。

基於這樣的理解,我們可以把 Kafka 想像成一條 管道

資料流的想像:Kafka 像是一條管道

Kafka Broker 更像是一條中空的管道,訊息只是沿著管道單向流動:

  • 流速與流量:取決於上游 Producer 的輸出能力,以及下游 Consumer 的處理速度。
  • 管道本身:不會主動改變流速或內容,而是確保資料能穩定、可靠地傳遞。

因此,Kafka 的角色更像是維持資料穩定流動的管道,而不是主動調整流速或負載的引擎。
在這樣的前提下,當我們談到 分片(Partition),真正需要思考的並不是管道本身如何分流,而是下游的需求:是否需要更高的並行處理?是否需要保證某一類訊息的順序?


Partition 與 Key 的設計思路

理解 Kafka 作為資料管道的角色後,我們接下來要關注的核心問題是:資料在管道中如何流動,以及如何分配給不同的消費者
在 Kafka 的設計中,Partition 與 Key 是決定資料流向與消費行為的關鍵因素:

  1. Partition:決定資料可以被多少消費者併行處理,影響整體的並行度與負載分布。
  2. Key:決定特定資料應被唯一消費,關乎業務邏輯正確性以及資料保序性。

下面我們透過表格整理兩者的設計原則與實際效益,幫助理解在不同需求下的最佳做法。


Partition 數量:伸縮性與效能平衡

考量需求 設計原則 實際效益
並行度上限 分片數 ≥ 預期最大消費者實例數 確保可透過擴增消費者因應流量尖峰
負載均衡 分片數 ≈ Broker 數量的倍數 避免熱點,讓 I/O 均勻分布
單分片極限 若單分片流量可能過高,則需要增加分片 避免瓶頸,分散壓力
維護複雜度 過多分片會增加元數據與同步成本 建議從合理基數開始(如 6、12、24)再逐步調整

說明
Partition 數量直接影響吞吐量與擴展性:數量太少限制消費者擴展,數量過多則增加元數據與維護成本。建議從合理基數開始,再依流量與消費者數量調整。


Key 的設計:保序性與業務對應

考量需求 設計原則 實際效益
需要嚴格保序 使用業務識別碼作為 Key(如 order_iduser_id 確保同一業務事件流入同一分片,保持順序
狀態一致性 Key 與資料庫或下游狀態標識一致 簡化狀態查找與 Flink/流處理分組
最大吞吐量 不設 Key(或高基數 Key) → Round-Robin 分散 提升整體效能與均衡

說明
Key 決定資料分配與順序保證:若需保持順序或狀態一致,應使用業務標識作為 Key;若追求吞吐量且順序不重要,可不設 Key 或使用高基數 Key,以均衡分片。


在前面討論 Partition 與 Key 的設計後,對於不熟悉 Kafka 的使用者,可能仍會感到困惑。其實,我們可以謹記一些最佳實踐原則:也就是在設計時,優先遵守這些原則,接下來我們根據不同業務情境,提出具體建議做法。

不同情境下的建議做法

資料有順序需求

  1. 不設 Key,並且避免多分片(單 Partition 可保序)。
  2. 若設 Key,Kafka 會將相同 Key 的資料送到同一 Partition,並由消費群組中的單一消費者處理,確保資料順序被正確消費。

資料有聚合需求

  1. 可以設 Key 將相同 Key 的資料分派到同一 Partition,以便下游進行聚合。
  2. 或者使用同一消費群組處理聚合,透過下游邏輯整理資料。

資料無順序要求

  1. 若追求最大吞吐量,可增加 Partition 數量以提高併行度。
  2. 仍建議避免多消費群組同時消費同一 Topic,以免產生重複處理,需要額外去重。

必要遵守規則

  1. 無論情境如何,每個 Partition 同時只會被消費群組中的單一消費者消費。
  2. 在沒有 Key 的情況下,該 Partition 的消費者可能是消費群組中的任一線程。

這就好像kafka的使用守則一般,是kafka的法律,我們應該以這個邏輯去思考設計,而不是以我們的想像讓規則配合。


小結

今天我們討論了 Kafka 的資料流概念,以及 Partition 與 Key 的設計思路。我刻意沒有深入探討資料儲存在哪個 Broker、如何分配或被消費,因為過早關注這些細節,容易讓設計目標變得混亂。事實上,這些底層細節 Kafka 已經替我們規範好了,使用者只需要理解原則並遵循,就能專注在資料流設計與業務邏輯上,而不必被枝節困擾。

Kafka 的價值在於提供穩定可靠的資料管道,我們的任務是安裝、使用、理解,偶爾調整參數,但其核心功能本身就是單純且理所當然的。

也許,這種以工程需求為導向的抽象設計,本身就是最簡潔、優雅的解法。希望今天的分享,能為各位帶來一些啟發。

感謝閱讀,我們明天再見!


上一篇
Day16 Kafka 高效的秘密:從硬體到抽象的設計哲學
下一篇
Day18 Kafka 常見部署與維運考量
系列文
雲端與資料平台實戰:從抽象概念到落地技術18
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言