Kafka的術語

1.1Kafka的術語

1.1.1Record

kafaka是一個消息引擎系統發佈的確定就是消息了,就是Producer發佈的消息主題java

1.1.2Topic

​ kafka發佈的消息對象,邏輯上的一個主題,經常和業務,場景相關負載均衡

1.1.3Partition

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的最大優點,多分區的負載均衡和高吞吐量的功能。

    這種狀況下咱們就可使用消息鍵值保存策略指定多個分區,並且業務場景變化系統須要擴展的時候 ,都是比較方便高效的。而不是僅僅爲了實現當前的功能去指定一個分區。

1.1.4Replic

kafka實現高可用的一種手段就是 Replication(備份機制)

每一個partition 有多個 replica

  • Leader(只有一個Leader Leader掛了後會從Follower 中選取一個 具體的選取策略和 配置有關)
  • Follower(副本不提供對外的服務)
    • Follower Replica 只作一件事,向領導者副本發送請求,請求Leader把最新生產的消息發送給她,這樣來保持與Leader的同步
1.1.5Broker(Server端)
  • cluster 由多個Broker組成
  • 接收clients的請求
  • 持久化消息
    • Kafaka使用消息日誌(Log)【磁盤上只能追加寫(Append-only)消息的物理文件】來保存數據
      • Log: 這樣能夠避免了緩慢的隨機I/O操做 修改成性能較好的順序I/O操做
      • Log Segment (若是一直追加不刪除的話磁盤,最終必定會消耗完磁盤的空間的,因此要定時的進行刪除 經過Log Segment 機制)
        • 一個Log能夠分爲多個Log Segment 消息會被追加到當前最新的日誌段中,固然Log Segment是有大小限制的而且每一個LogSegment的最大的size都是一致的。
        • 刪除 kafka的後臺有定時任務會按期的檢查老的Log Segment是否可以被刪除,從而實現回收磁盤空間的目的。
1.1.6 Clients
  • Producer

    • 向Topic發佈消息的客戶端應用程序成爲生產者
    • 能夠同時發佈多個Topic消息
  • Consumer

    • 訂閱消息的客戶端
    • 能夠同時訂閱多個Topic
1.1.7Consumer Group

提高消費者端的吞吐量

CG會均衡的去消息訂閱主題的Patition,一個Partition只能被消費者組中的一個Consumer Instance消費

1.1.8 consumer offset

​ 消費者組記錄consumer消費的索引位置

1.1.9offset

當前最新消息存儲的位置

1.1.10Rebalance

讓一個Consumer Group下全部的Consumer實例如何消費訂閱Tioic下的全部分區達成共識的過程。

全部的Consumer Instance共同參與,完成訂閱主題的分配。

Rebalacce的過程當中全部的消費者實例不能消費任何消息,對Consumer的TPS影響很大。

相關文章
相關標籤/搜索