Kafka中關於分割槽的一些理解

2021-10-06 07:08:55 字數 2307 閱讀 3807

分割槽和主題

一般我們會在乙個topic下設定多個分割槽,這樣多個分割槽對應多個消費者,以此可以提高kafka的吞吐量,相當於處理訊息時達到了多執行緒並行執行的效果。

分割槽和訊息

當生產者要向某個主題傳送訊息時,生產者會先將訊息序列化處理,然後根據topic,serializedkey,serializedvalue計算出當前訊息應該傳送到哪個分割槽中,預設情況下如果沒有指定key值,則按照類似輪詢分割槽數的方式傳送,如果指定了key值,則根據key值進行hash後取模傳送,所以同乙個key值得訊息會始終被傳送到乙個分割槽中,也就是會始終被乙個消費者消費到(考慮可以實現訊息的順序性,但同時會造成資源分配不均衡,降低訊息處理的能力)。

傳送時指定key的情況下

往topic為"test_topic"的主題中,指定key值,生產10條訊息

生產訊息

for

(int i =

0; i <

10; i++

)

接收訊息

@kafkalistener

(topics =

)public

void

listen

(consumerrecord,

?> record)

, value: {}, partition: {}"

, record.

key(

), record.

value()

.tostring()

, record.

partition());}

一共有4個分割槽

從結果可以看出,指定了key的情況下,所有的訊息都傳送到了分割槽0上

如果傳送時不指定key

從結果可以看出,如果不指定key的情況下,有的訊息在分割槽1上,有的訊息在分割槽3上。

kafka自定義分割槽器

如果有時候我們在傳送訊息需要通過key值來進行一些業務上的劃分,但key又會造成訊息始終只能傳送的乙個消費者中,導致處理能力降低,那麼這時候就可以通過自定義分割槽的方式,讓有key值的訊息也能按照比較均衡的方式傳送訊息。

自定義分割槽器

public

class

myselfpartitioner

implements

partitioner

public

void

close()

public

void

configure

(map

?> configs)

}

新增乙個配置屬性

public map

producerconfigs()

可以看出,雖然指定了key,但是已經明顯不是乙個分割槽了,而是根據value取模計算後獲取對應分割槽

分割槽和消費者的對應關係

當分割槽和消費者數量相同時,乙個分割槽對應乙個消費者。

當分割槽數大於消費者數時,那麼會出現乙個消費者對應多個分割槽。

當分割槽數小於消費者數時,多出來的消費者將不會消費任何訊息。

分割槽再均衡

當我們消費者數量發生變化,或者分割槽數發生變化,那麼kafka就需要重寫計算分割槽和消費者的對應關係,這種現象就叫做分割槽再均衡。一般情況下要盡量避免分割槽再均衡的發生,因為這會造成消費者無法讀取訊息,當時消費者會通過心跳來和broker保持連線,如果消費者長時間不傳送心跳那麼broker就為認為這個消費者已經掛掉了,那麼也會造成分割槽再均衡的發生。

Kafka中關於集群副本的一些理解

簡單的理解一下,副本就是對於分割槽中訊息的備份,是kafka中通過資料的冗餘保證高可用的一種方式,所以副本又是建立在kafka集群模式的基礎上的。下圖中表示的含義為 集群中有3臺broker,有乙個名為topic的主題,設定了分割槽數為3,副本數量為3。首領含義稍後解釋。如果分割槽的數量大於brok...

Kafka一些基本術語 理解

zookeeper 在kafka中的作用 其中 zookeeper 是 kafka 用來負責集群元資料的管理 控制器的選舉等操作的 borker,topic,partition之間的關係 個人理解 乙個topic中可以包含多個borker,乙個topic中劃分為幾個分割槽,乙個分割槽可以有多個副本,...

關於C 中new的一些理解

include int main string a new string 實際上分為兩步進行 1.呼叫 void operator new size t size 申請了size大小的記憶體,這個函式是可以過載的,但是第乙個引數必須是size t size 2.呼叫建構函式,但是這一步我們是不能夠修...