天天看點

kafka 概述

概覽

- kafka解決的問題

- 主題

- 分區

- 消息

- 生産者

- broker

- broker叢集

- 消費者

- 消費者組群

- 生産者分區和消費者群組

- 消息可靠性

- 消息系統

- 隊列和廣播

- 消息保序

- 存儲系統

- 流處理

- 整合

- 應用場景

- api分類

kafka解決的問題

生産者種類多,資料格式不同,資料源衆多,消費者種類多:使用生産者和消費者模式進行解耦

消費者無法依據自身處理情況輪詢拉取資料:提供資料持久化,按需取消息

消息系統無法橫向擴充:系統随流量進行很想水準擴充,使用消息批次加壓縮的模式提高消息傳輸效率

主題

通過主題對消息進行分類

可配置項

partition:分區數

日志相關設定:設定日志保留的時間;每個分區保留的日志大小; 每個日志片段的大小;多長時間關閉一個日志片段

單個消息的大小

kafka 概述

分區

一個主題的日志被分割成了多個分區

消息以追加的方式寫入分區,先進先出的隊列模式

分區可以在不同的伺服器上

一個分區可以配置設定到一個或者多個broker(kafka伺服器)上。其中一個為分區首領,其他為副本分區(提高可靠性)

首領副本:負責和生産者消費者進行互動;副本:從首領處拷貝保持同步

每個分區上的記錄都是保序的,分區會給每個記錄一個id(也就是offset)

每個分區會保留特定時間或者特定大小的資料

消息

包含:主題、分區、消息建、消息(入下圖)

批次

一組消息,一組消息屬于同一主題的同一分區,資料會被壓縮

生産者

生産者會決定發送消息的主題和分區(可以依靠平均分發,也可以依靠特定的字段)

如果沒有消息鍵,生産者将消息均勻的配置設定到不同的分區上

如果有消息鍵,同一個消息鍵的消息寫入相同的分區,使用者可以自定義分區器

生産者有消息發送重試、确認機制(提高可靠性),如果重試後依然失敗将抛出異常

kafka 概述

生産者可配置項

配置broker的位址(可以配置多個)

鍵、值的序列化類

緩沖區大小

生産者在收到伺服器響應前可以發送多少個消息(消息可靠保序的關鍵,一次隻發一個消息給broker,確定每個消息都能收到同時确認)

消費者

消費者可以在不同的機器上

消費者為每一個分區維護一個offset,記錄讀取消息的位置,offset記錄在zk中

消費者是可以調整offset來擷取想要的任意未被删除的資料

通過訂閱主題,主動拉取消息offset

配置項:

  是否自動送出

  指定分區配置設定政策

   在offset無效時讀取的政策

kafka 概述

再均衡監聽器

通過監聽,在發生在均衡的時候可以關閉一些資源(資料庫),送出offset

消費者群組

包含一個或者多個消費者

群組保證每個主題分區隻能被同一個消費者群組中的一個消費者消費

每個群組會消費每個主題的所有分區

如果所有的消費者有相同的分組,監聽同一個主題,消息隻會分發給一個消費者

如果所有的消費者有不同的分組,監聽同一個主題,消息會廣播給所有的消費者

生産者分區和消費者群組

一個主題的分區數量<消費者群組的消費者數量,有消費者空閑

一個主題的分區數量=消費者群組的消費者數量,一個消費者對應一個分區

一個主題的分區數量>消費者群組的消費者數量,多個分區的消息在一個消費者上處理

如果想要主題上所有的消息都保序,可以讓主題隻有一個分區,但是這樣将隻有一個消費者消費,失去擴充性

broker

kafka服務端,用來存放生産者産生的資料,為資料設定偏移量

響應消費者讀取資料的請求

broker的資料不會立刻消失

配置主題保留一段時間或者一定檔案大小的資料

配置主題僅保留最後一個帶有特定鍵的消息

配置:

id:叢集中唯一的id

port:kafka的port

zk位址

log.dirs:存放日志的位置

設定初始化時的線程數:和啟動速度有關

建立主題的時機,是否自動建立主題

broker叢集

第一步選舉出一個broker作為控制器,控制器的主要作用是:

将分區配置設定給broker

監控broker的狀态

将一個分區分為leader和follower,配置設定到不同的broker上。(目的是提高容錯性)

每個broker上都會有一些分區的leader,一些分區的follwer。(目的是為了負責均衡)

隻有leader分區響應生産者消費者

如果一個分區的leader挂掉後,會選擇一個處于同步狀态的副本作為新的leader

啟動步驟

在zk上注冊一個自己的節點,同時監聽Zookeeper的/brokers/ids路徑下broker的變化情況。删除時會在Zookeeper的/brokers/ids中删除節點,但是自己的broker id節點不會删除

在zk上/controller嘗試建立臨時節點,如果成功成為控制器,否則監聽控制器節點的變化

分區偏移量

消息消費後向特定的topic發送消息,将offset儲存在zk中。如果發生分區在均衡,這樣可以用kafka上擷取到offset,使得消費者無狀态

可以通過seek方法指定偏移量和分區

消息可靠性

同一個生産者生産的消息在broker中順序一緻

消費者消費消息的順序和日志中記錄的順序一緻

一個分區能有n個副本,能最大限度容忍n-1個副本挂掉

常見消息系統

隊列和廣播

常見的消息系統有消息隊列、消息廣播監聽

消息隊列:能在多個消費者之間進行消息分發,但是一旦消費消息将不見了

消息廣播監聽:能将消息分發給多個消費者,但是所有監聽的消費者都将收到消息

kafka使用消費者分組解決這個問題:相同分組内可以分發消息,不同分組間廣播

消息保序

傳統隊列,如果多個消費者進行消費。一個生産者發出消息的時候是保序的,但是并不能保證到達不同消費者處是保序的。是以很多時候隻能有一個消費者消費隊列,無法進行水準擴充

kafka使用一個主題加多個分區的方式,分區内部保序,一個消費者分組的一個消費者對應一個分區,保證消息保序。不同的消費者處理不同的分區

存儲系統

生産者生産消息,傳給broker,需要等待broker确認存儲成功

kafka使用日志片段的方式存儲,使得伸縮性很好,無論資料量大小

消費者可以自己控制offset選擇讀取内容

---------------------

作者:阿睿93

版權聲明:本文為部落客原創文章,轉載請附上博文連結!

繼續閱讀