Kafka吞吐量高的原因

這幾天在學習kafka,看了一些書和博文,看到了一篇博文感受頗深(深感大學的課程其實是非常重要的),所以這裏就把這篇文章精簡一下,順便當給自己鞏固一下知識。

注:本文如與《寫程序的康德--kafka爲什麼這麼快》有雷同,純屬我抄他的。

衆所周知kafka的吞吐量比一般的消息隊列要高,號稱the fastest,那他是如何做到的,讓我們從以下幾個方面分析一下原因。

生產者端

生產者負責寫入數據,Kafka會將消息持久化到磁盤,保證不會丟失數據,Kafka採用了倆個技術提高寫入的速度。

1.順序寫入:在大學的計算機組成(劃重點)裏我們學過,硬盤是機械結構,需要指針尋址找到存儲數據的位置,所以,如果是隨機IO,磁盤會進行頻繁的尋址,導致寫入速度下降。Kafka使用了順序IO提高了磁盤的寫入速度,Kafka會將數據順序插入到文件末尾,消費者端通過控制偏移量來讀取消息,這樣做會導致數據無法刪除,時間一長,磁盤空間會滿,kafka提供了2種策略來刪除數據:基於時間刪除和基於partition文件的大小刪除。

2.Memory Mapped Files:這個和Java NIO中的內存映射基本相同,在大學的計算機原理裏我們學過(劃重點),mmf直接利用操作系統的Page來實現文件到物理內存的映射,完成之後對物理內存的操作會直接同步到硬盤。mmf通過內存映射的方式大大提高了IO速率,省去了用戶空間到內核空間的複製。它的缺點顯而易見--不可靠,當發生宕機而數據未同步到硬盤時,數據會丟失,Kafka提供了produce.type參數來控制是否主動的進行刷新,如果kafka寫入到mmp後立即flush再返回給生產者則爲同步模式,反之爲異步模式。

消費者端

在這之前先來了解一下零拷貝:平時從服務器讀取靜態文件時,服務器先將文件從複製到內核空間,再複製到用戶空間,最後再複製到內核空間並通過網卡發送出去,而零拷貝則是直接從內核到內核再到網卡,省去了用戶空間的複製。

Kafka把所有的消息存放到一個文件中,當消費者需要數據的時候直接將文件發送給消費者,比如10W的消息共10M,全部發送給消費者,10M的消息在內網中傳輸是非常快的,假如需要1s,那麼kafka的tps就是10w。Zero copy對應的是Linux中sendfile函數,這個函數會接受一個offsize來確定從哪裏開始讀取。現實中,不可能將整個文件全部發給消費者,他通過消費者傳遞過來的偏移量來使用零拷貝讀取指定內容的數據返回給消費者。

總結

Kafka快的原因是他將一個個消息變成一個文件,通過mmp提高IO速度,寫入時在末尾直接添加,讀取時通過偏移量直接返回。

最後說點原作者沒有說的

不能因爲快我們的消息隊列就只選擇Kafka,技術的選型還是要結合具體的業務場景,合適的纔是最好的,不能只以快論英雄,這一點相信男同胞們深有體會。具體不同MQ的使用場景可以看我之前的文章,《Kafka還是RabbitMQ?》。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章