高達幾十萬併發的寫入,Kafka是到底如何實現的?

2021-10-21 12:34:26 字數 2658 閱讀 4076

在初識kafka 一文中講了使用mq(訊息佇列)來設計系統帶來的好處:業務解耦、流量削峰、靈活擴充套件

當下流行的mq有很多,因為我們公司在技術選型上選擇了使用kafka,所以我就整理了一篇關於kafka的入門知識。通過技術選型 我們對業界主流的mq進行了對比,kakfa最大的優點就是吞吐量高

kafka是高吞吐低延遲的高併發、高效能的訊息中介軟體,在大資料領域有極為廣泛的運用。配置良好的kafka集群甚至可以做到每秒幾十萬、上百萬的超高併發寫入。
那麼kafka是如何做到這麼高的吞吐量和效能的呢?在入門之後我們就來深入的扒一下kafka的架構設計原理,掌握這些原理在網際網路面試中會佔據優勢

kafka對訊息的儲存和快取依賴於檔案系統,每次接收資料都會往磁碟上寫,人們對於「磁碟速度慢」的普遍印象,使得人們對於持久化的架構能夠提供強有力的效能產生懷疑。

事實上,磁碟的速度比人們預期的要慢的多,也快得多,這取決於人們使用磁碟的方式。而且設計合理的磁碟結構通常可以和網路一樣快。

通過上圖對比,我們可以看出實際上順序磁碟訪問在某些情況下比隨機記憶體訪問還要快,其實kafka就是利用這一優勢來實現高效能寫磁碟
kafka 為了保證磁碟寫入效能,首先kafka是基於作業系統的頁快取來實現檔案寫入的。

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

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

通過上圖這種方式可以將磁碟檔案的寫效能提公升很多,其實這種方式相當於寫記憶體,不是在寫磁碟
順序寫磁碟對於普通的機械硬碟如果你要是隨機寫的話,確實效能極低,這裡涉及到磁碟定址的問題。但是如果只是追加檔案末尾按照順序的方式來寫資料的話,那麼這種磁碟順序寫的效能基本上可以跟寫記憶體的效能本身是差不多的。

來總結一下:kafka就是基於頁快取技術 + 磁碟順序寫 技術實現了寫入資料的超高效能。

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

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

如果kafka以上面這種方式從磁碟中讀取資料傳送給下游的消費者,大概過程是:

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

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

整個過程如下圖:

從上圖可以看出,這整個過程有兩次沒必要的拷貝一次是從作業系統的cache裡拷貝到應用程序的快取裡,接著又從應用程式快取裡拷貝回作業系統的socket快取裡。

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

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

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

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

體會一下這個精妙的過程吧

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

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

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

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

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

通過學習kafka的優秀設計,我們了解了kafka底層的頁快取技術的使用,磁碟順序寫的思路,以及零拷貝技術的運用,才能使得kafka有那麼高的效能,做到每秒幾十萬的吞吐量。

一文了解幾十萬年的科技史

最近讀完了吳軍的 全球科技通史 寫點讀書筆記吧。人類發展到今天,也不過是物競天擇 適者生存的結果而已。大自然的演算法就是廣撒網重點捕撈,人類不過是當初無數個隨機數中的乙個而已。人類的初創期還是很艱難,要和其他生物競爭,甚至和其他也可以叫作人類的物種競爭,進步也主要靠基因變異。今天很多我們習以為常的想...

Kafka如何實現每秒上百萬的高併發寫入

kafka是高吞吐低延遲的高併發 高效能的訊息中介軟體,在大資料領域有極為廣泛的運用。配置良好的kafka集群甚至可以做到每秒幾十萬 上百萬的超高併發寫入。那麼kafka到底是如何做到這麼高的吞吐量和效能的呢?首先kafka每次接收到資料都會往磁碟上去寫,為了保證資料寫入效能,kafka是基於作業系...

Redis 幫你的專案扛起十萬級併發

現在網際網路系統的特點 快!需求變化快,系統響應速度要快。像 微博等有上億使用者的 每日有上千萬的訪問量 當電商節開始時如 618,當有熱點事件時如 明星官宣結婚等等,訪問量更是暴增。傳統的小 的架構根本無法滿足需求,這就需要改變傳統的架構模式來應對該問題,如 增加快取。快取就是把資料從訪問速度慢的...