分割槽和主題
一般我們會在乙個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.呼叫建構函式,但是這一步我們是不能夠修...