kafaka是一個消息引擎系統發佈的確定就是消息了,就是Producer發佈的消息主題java
kafka發佈的消息對象,邏輯上的一個主題,經常和業務,場景相關負載均衡
1.什麼事分區dom
kafka在建立topic的時候須要指定partition數,均勻分佈在不一樣的Broker上,通常狀況下Partition和Broker的數量是一致的。這樣作的好處是 提高系統的伸縮性,提供了負載均衡的能力,也能夠根據對分區作具體的操做。性能
2.kafak的分區策略spa
首先kafka想要自定義分區策略的時候須要實現kafka的Partitioner接口,這個接口僅僅定義了兩個方法日誌
partition(),close(),咱們僅僅須要實現partition方法去定製咱們須要的分區策略。code
/** * topic key keyBytes valueBytes都是消息數據 * cluster 是集羣數據 * 咱們能夠充分利用這些信息對消息進行分區,計算出它要被髮送到呢個分區上去 **/
int partition(String topic, Object key, byte[] keyBytes, Object value, byte[] valueBytes, Cluster cluster);
複製代碼
輪詢策略對象
kafaka的默認分區策略,最大限度的保證消息平均的發送到各個分區上,也是默認的最合理的分區策略。索引
隨機策略接口
代碼實現隨機分區策略
//實現partition接口重寫partition方法
//先計算出全部的分區數 然乎隨機地返回一個小於它的正整數
List<PartitionInfo> partitions = cluster.partitionsForTopic(topic);
return ThreadLocalRandom.current().nextInt(partitions.size());
複製代碼
雖然隨機策略也是保證消息到每一個partition的機率是同樣的,可是它僅僅是一個僞均衡,如何咱們的項目需求是均勻分佈,仍是要使用輪詢策略。
消息鍵值保存策略
very very very important的一個分區策略。
容許爲每條消息定義消息鍵,簡稱爲Key 相同的Key 會放在一個分區上
能夠表明明確業務含義的字符串(客戶代碼,部門編號或者業務Id等)
List<PartitionInfo> partitions = cluster.partitionsForTopic(topic);
return Math.abs(key.hashCode()) % partitions.size()
複製代碼
存在一種場景若是咱們須要保證咱們的Topic 的消息是徹底有序的狀況下,使用輪詢和隨機策略就是不能實現的,由於kafka 的消息僅僅是保證消息在每一個分區上有序。這樣大多數狀況下咱們會選擇僅僅給當前的Topic建立一個partition,當時這樣就喪失了kafka的最大優點,多分區的負載均衡和高吞吐量的功能。
這種狀況下咱們就可使用消息鍵值保存策略指定多個分區,並且業務場景變化系統須要擴展的時候 ,都是比較方便高效的。而不是僅僅爲了實現當前的功能去指定一個分區。
kafka實現高可用的一種手段就是 Replication(備份機制)
每一個partition 有多個 replica
Producer
Consumer
提高消費者端的吞吐量
CG會均衡的去消息訂閱主題的Patition,一個Partition只能被消費者組中的一個Consumer Instance消費
消費者組記錄consumer消費的索引位置
當前最新消息存儲的位置
讓一個Consumer Group下全部的Consumer實例如何消費訂閱Tioic下的全部分區達成共識的過程。
全部的Consumer Instance共同參與,完成訂閱主題的分配。
Rebalacce的過程當中全部的消費者實例不能消費任何消息,對Consumer的TPS影響很大。