Kafka高併發原理概述

2022-06-06 12:51:12 字數 2276 閱讀 9275

kafka是高吞吐低延遲的高併發、高效能的訊息中介軟體,在大資料領域有極為廣泛的運用。配置良好的kafka集群甚至可以做到每秒幾十萬、上百萬的超高併發寫入。

那麼kafka到底是如何做到這麼高的吞吐量和效能的呢?這篇文章我們來一點一點說一下。

首先kafka每次接收到資料都會往磁碟上去寫,如下圖所示。

那麼在這裡我們不禁有乙個疑問了,如果把資料基於磁碟來儲存,頻繁的往磁碟檔案裡寫資料,這個效能會不會很差?大家肯定都覺得磁碟寫效能是極差的。

沒錯,要是真的跟上面那個圖那麼簡單的話,那確實這個效能是比較差的。

但是實際上kafka在這裡有極為優秀和出色的設計,就是為了保證資料寫入效能,首先kafka是基於作業系統的頁快取來實現檔案寫入的。

作業系統本身有一層快取,叫做page cache,是在記憶體裡的快取,我們也可以稱之為os cache,意思就是作業系統自己管理的快取。

你在寫入磁碟檔案的時候,可以直接寫入這個os cache裡,也就是僅僅寫入記憶體中,接下來由作業系統自己決定什麼時候把os cache裡的資料真的刷入磁碟檔案中。

僅僅這乙個步驟,就可以將磁碟檔案寫效能提公升很多了,因為其實這裡相當於是在寫記憶體,不是在寫磁碟,大家看下圖。

接著另外乙個就是kafka寫資料的時候,非常關鍵的一點,他是以磁碟順序寫的方式來寫的。也就是說,僅僅將資料追加到檔案的末尾,不是在檔案的隨機位置來修改資料。

普通的機械磁碟如果你要是隨機寫的話,確實效能極差,也就是隨便找到檔案的某個位置來寫資料。

但是如果你是追加檔案末尾按照順序的方式來寫資料的話,那麼這種磁碟順序寫的效能基本上可以跟寫記憶體的效能本身也是差不多的。

所以大家就知道了,上面那個圖里,kafka在寫資料的時候,一方面基於了os層面的page cache來寫資料,所以效能很高,本質就是在寫記憶體罷了。

另外乙個,他是採用磁碟順序寫的方式,所以即使資料刷入磁碟的時候,效能也是極高的,也跟寫記憶體是差不多的。

基於上面兩點,kafka就實現了寫入資料的超高效能。

那麼大家想想,假如說kafka寫入一條資料要耗費1毫秒的時間,那麼是不是每秒就是可以寫入1000條資料?

但是假如kafka的效能極高,寫入一條資料僅僅耗費0.01毫秒呢?那麼每秒是不是就可以寫入10萬條數?

所以要保證每秒寫入幾萬甚至幾十萬條資料的核心點,就是盡最大可能提公升每條資料寫入的效能,這樣就可以在單位時間內寫入更多的資料量,提公升吞吐量。

說完了寫入這塊,再來談談消費這塊。

大家應該都知道,從kafka裡我們經常要消費資料,那麼消費的時候實際上就是要從kafka的磁碟檔案裡讀取某條資料然後傳送給下游的消費者,如下圖所示。

那麼這裡如果頻繁的從磁碟讀資料然後發給消費者,效能瓶頸在**呢?

假設要是kafka什麼優化都不做,就是很簡單的從磁碟讀資料傳送給下游的消費者,那麼大概過程如下所示:

先看看要讀的資料在不在os cache裡,如果不在的話就從磁碟檔案裡讀取資料後放入os cache。

接著從作業系統的os cache裡拷貝資料到應用程式程序的快取裡,再從應用程式程序的快取裡拷貝資料到作業系統層面的socket快取裡,最後從socket快取裡提取資料後傳送到網絡卡,最後傳送出去給下游消費。

整個過程,如下圖所示:

大家看上圖,很明顯可以看到有兩次沒必要的拷貝吧!

一次是從作業系統的cache裡拷貝到應用程序的快取裡,接著又從應用程式快取裡拷貝回作業系統的socket快取裡。

而且為了進行這兩次拷貝,中間還發生了好幾次上下文切換,一會兒是應用程式在執行,一會兒上下文切換到作業系統來執行。

所以這種方式來讀取資料是比較消耗效能的。

kafka為了解決這個問題,在讀資料的時候是引入零拷貝技術。

也就是說,直接讓作業系統的cache中的資料傳送到網絡卡後傳輸給下游的消費者,中間跳過了兩次拷貝資料的步驟,socket快取中僅僅會拷貝乙個描述符過去,不會拷貝資料到socket快取。

通過零拷貝技術,就不需要把os cache裡的資料拷貝到應用快取,再從應用快取拷貝到socket快取了,兩次拷貝都省略了,所以叫做零拷貝。

對socket快取僅僅就是拷貝資料的描述符過去,然後資料就直接從os cache中傳送到網絡卡上去了,這個過程大大的提公升了資料消費時讀取檔案資料的效能。

而且大家會注意到,在從磁碟讀資料的時候,會先看看os cache記憶體中是否有,如果有的話,其實讀資料都是直接讀記憶體的。

如果kafka集群經過良好的調優,大家會發現大量的資料都是直接寫入os cache中,然後讀資料的時候也是從os cache中讀。

相當於是kafka完全基於記憶體提供資料的寫和讀了,所以這個整體效能會極其的高。

java 併發 高併發概述

為什麼需要並行 有關並行的重要概念 有關並行效能的2個重要定律 多執行緒基礎 執行緒的基本操作 守護執行緒 優先順序 中斷處理 基本的執行緒同步操作 各種同步控制工具的使用 併發容器及典型原始碼分析 同步工具 併發容器使用小案例 第5課 jdk並發包 執行緒池的基本使用 擴充套件和增強執行緒池 執行...

高併發原理

高併發 high concurrency 是網際網路分布式系統架構設計中必須考慮的因素之一,它通常是指,通過設計保證系統能夠同時並行處理很多請求。提高系統併發能力的方式,方 上主要有兩種 垂直擴充套件 scale up 與水平擴充套件 scale out 處理高併發有三種手段 1 橫向擴充套件 增加...

Kafka工作原理簡要概述

流程圖 詞彙 topic 主題 producer 生產者 consumer 消費者 consumer group 消費者組 offset 偏移量 follower 副本 要點概述 kafka是以topic進行分類的,由producer生產資料傳送到topic,再被consumer進行消費,同時off...