天天看點

kafka學習_深入了解kafka-學習筆記kafka體系結構:主題和分區:生産者:發送消息的三種模式:消費者:kafka持久化原理

kafka體系結構:

  • kafka體系架構包含若幹producer,若幹broker,和若幹consumer,以及zookeeper叢集組織;
  • Zookeeper是Kafka用來負責叢集中繼資料的管理、控制器的選舉等操作。
  • Producer:生産者,即發送消息的一方。生産者負責建立消息,然後将其投遞到Kafka中
  • Broker:一個獨立的Kafka服務節點。 一個或多個Broker組成了一個Kafka叢集
  • Consumer: 消費者,也就是接收消息的一方。消費者連接配接到Kafka上并拉取消息,進行相應的業務邏輯處理
kafka學習_深入了解kafka-學習筆記kafka體系結構:主題和分區:生産者:發送消息的三種模式:消費者:kafka持久化原理

主題和分區:

kafka的每條消息都屬于一個主題,生産者負責将消息發送到特定的主題,而消費者負責定義主題消費;一個主題可以細分為多個分區,一個分區屬于單個主題,分區可以看成一個可追加的日志檔案,消息在被追加到分區日志檔案時會配置設定一個偏移量,偏移量是消息在分區中的唯一辨別,kafka保證了偏移量在分區中是有序的。每一條消息發送時會根據分區規則選擇存儲到那個分區,在主題建立之後可以通過修改分區的數量實作水準擴充。

kafka學習_深入了解kafka-學習筆記kafka體系結構:主題和分區:生産者:發送消息的三種模式:消費者:kafka持久化原理

多副本機制(Replica機制)

多副本機制是通過增加副本數量進行資料備援,進而提高容災能力,副本之間是一主多從的關系,其中leader副本負責處理讀寫請求,follower副本隻負責與leader副本的消息同步,當leader副本當機時通過leader選舉和失效轉移,保證kafka的高可用性。

kafka學習_深入了解kafka-學習筆記kafka體系結構:主題和分區:生産者:發送消息的三種模式:消費者:kafka持久化原理

生産者:

kafkaProducer是線程安全的

  • 配置生産者用戶端參數并建立生成這執行個體;
  • 建構待發送消息;
  • 發送消息;
  • 關閉生産者執行個體

發送消息的三種模式:

  • 發後即忘

隻管發送消息,不關心資訊是否正确到達。

優點:性能最高,吞吐量大 缺點:會造成資料丢失,可靠性低

  • 同步

發送消息後傳回Future對象,調用get()方法時阻塞等待,直到發送成功或出現異常

優點:可靠性高,如有異常可處理或進行消息重發 缺點:性能低,造成阻塞

  • 異步

發送消息時指定回調函數,Kafka在傳回響應時會調用該函數實作異步的發送确認。

在同一個分區中,如果消息record1比record2先發送,那麼它會保證callback1在callback2之前調用。

序列化器

  • 生産者使用序列化器将對象轉換為位元組數組,才能通過網絡發送給Kafka
  • 消費者使用反序列化其把Kafka中收到的位元組數組轉換為相應的對象。
  • 是以生産者的序列化器和消費者使用的反序列化器要一一對應

分區器

分區器 是根據key這個字段來計算partition值。它的作用是為消息配置設定分區

生産者攔截器

生産者攔截器既可用來在消息發送前做一些準備工作如 按照某個規則過濾掉不符合要求的消息,修改消息内容等。也可以用來在發送回調邏輯前做一些定制化需求,如統計工作。 還可以指定多個攔截器形成攔截器鍊

kafka學習_深入了解kafka-學習筆記kafka體系結構:主題和分區:生産者:發送消息的三種模式:消費者:kafka持久化原理

整個生産者用戶端由 主線程和Sender線程構成

在④中,是用于緩存消息,以便Sender線程進行批量發送,進而減少網絡傳輸

在⑤中,是将 轉化為 。 即邏輯位址到實體位址的轉化

在⑦中,用于緩存尚未收到回應的消息,以便異常時可進行重發

重要參數 max.in.flight.requests.per 預設值為5,即每個連接配接最多隻能緩存5個未響應的請求。 可類比于TCP連接配接中的滑動視窗大小

中繼資料是指Kafka叢集中的中繼資料,這些中繼資料記錄了叢集中有哪些主題,這些主題有哪些分區,每個分區的leader副本配置設定在哪個節點上,follwer副本配置設定在哪些節點上,哪些副本在AR,ISR集合中,叢集有哪些節點,控制節點又是哪一個等資訊。

幾個重要的參數

acks : 用來指定分區中必須要有多少個副本收到這條消息,這樣生産者才認為消息寫入成功

取值為1 : 隻要leader副本成功寫入消息,就會收到kafka的成功響應

取值為0: 不需要等待任何伺服器響應,寫入就認為成功

取值為-1或all:需要等待ISR中的所有副本都成功寫入消息,才會收到kafka的成功響應

max.request.size

限制生産者用戶端能發送消息最大值

retires 、retry.backoff.ms

配置生産者重試次數 、 兩次重試的時間間隔

max.in.flight.requests.per.connection

預設值為5,即每個連接配接最多隻能緩存5個未響應的請求。

當此參數 > 1 ,則會因為重發而出現錯序的問題

消費者:

可以看出自動送出編碼簡單但會出現消息丢失和重複消費現象,并且無法做到精确的位移管理,是以Kafka還提供了 手動送出的方式。通常不是拉取到消息就算消費完成了,而是當我們通過這條消息完成一系列業務處理後,才認為消息被成功消費。開啟手動送出需要enable.auto.commit設定為false

手動送出可分為 同步送出和異步送出。 即commitSync()和commitAsync()兩種方式

內建maven jar包

kafka學習_深入了解kafka-學習筆記kafka體系結構:主題和分區:生産者:發送消息的三種模式:消費者:kafka持久化原理
kafka學習_深入了解kafka-學習筆記kafka體系結構:主題和分區:生産者:發送消息的三種模式:消費者:kafka持久化原理
kafka學習_深入了解kafka-學習筆記kafka體系結構:主題和分區:生産者:發送消息的三種模式:消費者:kafka持久化原理

kafka持久化原理

Topic在邏輯上可以被認為是一個queue。每條消費都必須指定它的topic,可以簡單了解為必須指明把這條消息放進哪個queue裡。為了使得Kafka的吞吐率可以水準擴充,實體上把topic分成一個或多個partition,每個partition在實體上對應一個檔案夾,該檔案夾下存儲這個partition的所有消息和索引檔案。

 每個日志檔案都是“log entries”序列,每一個log entry包含一個4位元組整型數(值為N),其後跟N個位元組的消息體。每條消息都有一個目前partition下唯一的64位元組的offset,它指明了這條消息的起始位置

繼續閱讀