Kafka總結系列(二)

2021-07-13 23:55:20 字數 1525 閱讀 4292

kafka高度依賴於檔案系統來儲存和快取訊息。對於磁碟的正確認識:對磁碟的線性讀寫比隨機讀寫快很多倍,且有研究表明:對磁碟的線性讀寫在有些情況下可以比記憶體的隨機訪問要更快!

在訊息佇列系統中,如果磁碟的因素被排除之後(線性讀寫磁碟的速度並不那麼慢),還有兩個原因會導致inefficiency:太多io操作(too many small i/o operation)和過多的位元組拷貝(excessive byte coping)。

1、small io發生在client和server的互動中以及server本身的持久化操作中。為了避免,我們將訊息組織成「message set」進行網路傳輸,所以server每次追加chunks of message至日誌檔案中(即批量寫入),consumer也一次獲取large linear chunks。

所有的批處理導致較大的網路資料報,較大的連續的磁碟操作,連續記憶體塊,等等,使kafka由隨機訊息寫入突發流變成線性流。

批量生產和批量消費可以在producer和consumer的配置檔案中指定:

producer.type:生產模式:同步或者非同步,非同步意味著訊息會在本地buffer快取,之後批量傳送,毫無疑問這可以增加吞吐量,但是當producer所在機器發生故障時,會丟失未傳送的資料;

fetch.message.max.bytes:consumer獲取訊息的最大位元組數,broker不會向consumer輸出大於此值的訊息chunk,每次消費會得到多條訊息,此值為總大小。

2、byte copying:我們在生產者、消費者以及broker之間採用統一的二進位制訊息格式,這樣傳輸時不需要格式轉換。linux作業系統中提供了乙個sendfile系統呼叫,將資料從頁緩衝區傳輸至socket套接字:

常見的資料從檔案系統傳輸至socket經過的路徑:

上述操作不高效,存在四次資料拷貝,兩次系統呼叫。如果使用sedfile,允許作業系統將資料從核心頁緩衝區直接傳送到網路上,只需要最後一步的拷貝,即從socket buffer到網絡卡緩衝區,這就是zero-copy技術。

乙個topic有多個consumer是一種常見的應用場景,利用上述的零拷貝技術,資料只被拷貝至頁緩衝區一次就可以在每次消費時重複利用,而不是訊息儲存在記憶體中,之後每次消費的時候再從記憶體拷貝到核心空間。這使得訊息消費的速率可以達到網路連線的速度。

3、頁緩衝區和sendfile的組合,意味著看不到kafka集群的消費者在任何磁碟上的活動,因為他們將完全從快取中提取資料。

生產者直接將訊息傳送給topic某乙個分割槽的leader broker(直接和leader通訊,可以自己指定分割槽策略(可以指定乙個字段作為key,使用它進行hash分割槽),也可以使用預設的輪詢機制)。消費者會給配置檔案中指定的broker傳送請求,獲知哪些伺服器可用,該topic的分割槽對應的leader broker分別是誰等資訊,而

kafka的brokers應該能夠回答這樣的請求。

producer可以非同步傳送,批量生產。可以通過配置檔案配置batch:指定訊息條數,或者指定累積的位元組數或者是時間間隔。也就是先將訊息快取在記憶體中,一定規模後一次性傳送,這會帶來更低的io開銷,增加吞吐量,但會增加延遲,所以需要tradeoff。

Kafka總結系列(三)

kafka的消費者通過向broker傳送 fetch 請求獲取他要消費的partition的資訊。消費者在每個請求中標記他已經消費到的offset值,broker將以該offset作為起始位置的a chunk of log即一批訊息返回給consumer。可見消費者自己維護消費狀態,broker是無...

kafka入門系列二

在入門 系列一,我進行了單節點的安裝,本文我將安裝多節點的集群。在kafka中,乙個broker就是集群中的乙個節點,而我們在乙個kafka中可以啟動多個broker,所以一台機器,裝乙個kafka,通過啟動多個broker的形式,就可以建乙個集群。下面我一步步演示 1.配置多個broker,這個主...

Kafka系列二 kafka相關問題理解

類jms訊息佇列,結合jms中的兩種模式,可以有多個消費者主動拉取資料,在jms中只有點對點模式才有消費者主動拉取資料。kafka是乙個生產 消費模型。producer 生產者,只負責資料生產,生產者的 可以整合到任何系統中。資料的分發策略由producer決定,預設是defaultpartitio...