訊息佇列 006 談一談Kafka的那些事

2021-10-04 18:58:53 字數 3202 閱讀 4762

面向面試的部落格,以問答式q/a方式呈現。

kafka 是一種高吞吐量、高可用、基於發布/訂閱的訊息系統,最初由 linkedin 公司開發,使用scala 語言編寫,目前是 apache 的開源專案。

附:

高吞吐量:生產者傳送資料的時候採用壓縮的方式來減少傳輸的資料量,減輕對網路傳輸的壓力,採用批量傳送的方式來減少 broker 儲存訊息的 io 操作次數,獲得更大的吞吐量。

高可用:同乙個partition的replica副本盡量分散到不同的機器,保證高可用,不會因為某乙個broker故障影響整體。

圖中概念解釋:

partitioned data pubilcation:分割槽資料發布;ordered subscription:訂購;

topica-part0:表示topica-partition0,同理,topica-part1 表示topica-partition1,topica-part2 表示 topica-partition2,同乙個partition只能有乙個leader,由zookeeper負責partition中leader的選舉。

圖中內容解釋:

乙個topic可以包含多個partition,如圖所示,同時注意,同乙個partition的replica副本盡量分散到不同的機器,保證高可用,圖中topica-part0在左邊和中間兩個broker上,圖中topica-part1在中間和右邊兩個broker上,圖中topica-part2在左邊和右邊兩個broker上,都不會在同乙個broker上的,體現kafka高可用。

broker:kafka 伺服器,負責訊息儲存和**。

topic:訊息類別,kafka 按照 topic 來分類訊息。

partition:topic 的分割槽,乙個 topic 可以包含多個 partition,topic 訊息儲存在各個partition 上。

offset:訊息在日誌中的位置,可以理解是訊息在 partition 上的偏移量,也是代表該訊息的唯一序號。

producer:訊息生產者。

consumer:訊息消費者。

consumer group:消費者分組,每個 consumer 必須屬於乙個 group。

zookeeper:儲存著集群 broker、topic、partition 等 meta 資料;另外,還負責 broker 故障發現,partition leader 選舉,負載均衡等功能。

kafka 資料儲存結構包括 partition資料檔案、segment資料檔案、資料索引檔案,如下:

partition 資料檔案( offset,messagesize,data )

partition中的每條message包含了以下三個屬性:

offset,messagesize,data。

offset表示 message 在這個 partition 中的偏移量,offset 不是該 message 在 partition 資料檔案中的實際儲存位置,而是邏輯上乙個值,它唯一確定了partition中的一條message,可以認為offset是 partition 中 message 的 id;

messagesize 表示訊息內容 data 的大小;

data 為 message 的具體內容。

segment資料檔案( 順序讀寫、分段命令、二分查詢 )

順序讀寫:partition 物理上由多個 segment 檔案組成,每個 segment 大小相等,順序讀寫。

分段命令:每個 segment資料檔案以該段中最小的 offset 命名,擴充套件名為.log。

二分查詢:這樣在查詢指定 offset 的 message 的時候,用二分查詢就可以定位到該 message 在哪個 segment 資料檔案中。

索引檔案(分段索引、 稀疏儲存 )

分段索引:kafka 為每個分段後的資料檔案建立了索引檔案,檔名與資料檔案的名字是一樣的,只是擴充套件名為.index。

稀疏儲存:index 檔案中並沒有為資料檔案中的每條 message 建立索引,而是採用了稀疏儲存的方式,每隔一定位元組的資料建立一條索引。這樣避免了索引檔案占用過多的空間,從而可以將索引檔案保留在記憶體中。

索引檔案和資料檔案對應關係,如下圖所示:

左邊.index是索引檔案,右邊.log是資料檔案。

kafka 生產者設計架構,如下圖所示:

1、負載均衡(partition 會均衡分布到不同 broker 上)

由於訊息 topic 由多個 partition 組成,且 partition 會均衡分布到不同 broker 上,因此,為了有效利用 broker 集群的效能,提高訊息的吞吐量,producer 可以通過隨機或者 hash 等方式,將訊息平均傳送到多個 partition 上,以實現負載均衡。

2、批量傳送

是提高訊息吞吐量重要的方式,producer 端可以在記憶體中合併多條訊息後,以一次請求的方式傳送了批量的訊息給 broker,從而大大減少 broker 儲存訊息的 io 操作次數。但也一定程度上影響了訊息的實時性,相當於以時延代價,換取更好的吞吐量。

kafka 消費者設計架構,如下圖所示:

同一 consumer group 中的多個 consumer 例項,不同時消費同乙個 partition,等效於佇列模式。partition 內訊息是有序的,consumer 通過 pull 方式消費訊息。kafka 不刪除已消費的訊息。對於 partition,順序讀寫磁碟資料,以時間複雜度 o(1)方式提供訊息持久化能力。

訊息佇列 訊息佇列 kafka

kafka是乙個分布式的基於發布 訂閱模式的訊息佇列,主要用於大資料實時處理領域。要理解kafka首先要有分布式的概念,要有訊息佇列的概念。分布式系統最大的優勢就是解耦和削峰,這種情況下,a系統生成了乙個訊息,b系統非同步獲取,那麼就需要乙個存放訊息的訊息佇列 mq 相比較傳統的訊息佇列,訊息被消費...

訊息佇列(一) Kafka概述

iwehdio的 學習自 訊息佇列有什麼使用場景?消費者怎麼從訊息佇列裡邊得到資料?引入訊息佇列會產生什麼問題?重複消費 如何保證介面冪等 弱校驗 順序消費 kafka為了擁有更強大的功能,提供了四大核心介面 topics producers consumers 訊息在kafka中的處理歷程 訊息生...

談一談教育

今晚和研究生的師兄聊了會天,突然就說到教育的問題,有點感想,就寫下來,算是我對中國教育的一點看法吧。毫無疑問,中國的教育體制存在不少問題。在高中的時候或許還不是那麼明顯 對比起大學來說 上了大學,我才看清了我們教育的一些弊端。我覺得,最大的弊端,在於價值觀的引導問題上。不知道大家有沒和我一樣覺得當今...