Kakfa同一主題下不同分區(qū)包含的消息不同
Kakfa同一主題下不同分區(qū)包含的消息不同
這是Kafka設(shè)計核心機制之一:
Kafka 主題(Topic)下不同分區(qū)(Partition)存儲的是完全不同的消息。它們共同組成了整個主題的數(shù)據(jù)集,但每個分區(qū)都是該數(shù)據(jù)集的一個獨立子集。
可以把Kafka主題想象成一個邏輯上的信息流(如:AA),這個巨大的消息流為了能夠并行處理和水平擴展,被切分成了許多的分區(qū)。
1、分區(qū)是物理存儲的基本單位
- 每個分區(qū)對應(yīng)物理上一個文件夾(例如:topic-AA-0、topic-AA-1)存儲在Kafka的日志目錄下
- 每個分區(qū)都是一個獨立、不可變的消息序列
- 消息在分區(qū)內(nèi)會被分配一個唯一的、遞增的偏移量(Offset),用于標記其位置
2、消息如何分配到不同分區(qū)
生產(chǎn)者發(fā)送消息時,決定消息進入哪個分區(qū),規(guī)則如下:
- 指定分區(qū)(Partition):生產(chǎn)者可以直接指定目標分區(qū)
- 指定消息鍵(Key):生產(chǎn)者給消息設(shè)置一個key,Kafka對這個key進行哈希計算,根據(jù)hash值把同一個key的消息路由到同一個分區(qū)
好處:保證所有具有相同key的消息存儲在同一個分區(qū),并且保持嚴格的順序 - 不指定Key(Round-Robin):生產(chǎn)者輪詢的方式將消息依次發(fā)送到主題的各個分區(qū),以實現(xiàn)負載均衡
3、消費者如何消費?
- 消費者以消費者組(Consumer Group)的形式工作
- Kafka會將一個主題的所有分區(qū) 分配給組內(nèi)的各個消費者實例。一個分區(qū)同一時間只能被同一個消費者組內(nèi)的一個消費者消費
- 這樣組內(nèi)的多個消費者就可以并行的從不同分區(qū)讀取消息,極大提高吞吐量
- 因為分區(qū)內(nèi)的消息是有序的,而單個消費者按順序消費一個分區(qū),所以它能保證該分區(qū)消息的順序性
4、舉例說明
假設(shè)我們有一個主題 order-events,它有 3 個分區(qū)(P0, P1, P2)
場景A:生產(chǎn)者發(fā)送沒有 Key 的消息,不指定分區(qū)
- 發(fā)送消息 M1, M2, M3, M4, M5...
- 它們可能會被這樣分配:
- 分區(qū) P0: M1, M4, ...
- 分區(qū) P1: M2, M5, ...
- 分區(qū) P2: M3, ...
場景B:生產(chǎn)者發(fā)送帶 Key 的消息(Key=訂單ID)
-
發(fā)送消息
-
發(fā)送消息
-
發(fā)送消息 {Key: "order-123", Value: "paid"} // 注意,同一條訂單的消息
-
哈希計算后,假設(shè):
- "order-123" 的hash值總是映射到分區(qū)P1
- "order-456" 的hash值總是映射到分區(qū)P0
-
最終分配結(jié)果:
- 分區(qū) P0:
- 分區(qū) P1: {Key: "order-123", Value: "created"},
- 分區(qū) P2: 空
這個例子中,關(guān)于order-123 的所有事件(創(chuàng)建、支付)都嚴格有序地存儲在分區(qū)P1中。當消費者從P1開始消費,它會先讀到"created",再讀到"paid",順序得到保證。
5、要點總結(jié)
- 數(shù)據(jù)不同:不同分區(qū)包含的消息是完全不同的,它們是整個主題數(shù)據(jù)的子集
- 順序保證:分區(qū)內(nèi)的消息是有序的,通過offset保證,offset不跨分區(qū)
- 并行性:分區(qū)是Kafka 并行處理的最小單位,多個消費者可以同時從不同分區(qū)讀取,提高吞吐量
- 擴展性:增加分區(qū)水平擴展主題的吞吐量和容量
- 消息鍵(Key):使用消息鍵可以確保相關(guān)消息被寫入同一分區(qū),保證局部有序性
通過主題邏輯統(tǒng)一,分區(qū)分而治之,kafka實現(xiàn)了高吞吐、低延遲、高可擴展性。
浙公網(wǎng)安備 33010602011771號