為什麼Kafka效能強於RabbitMQ
一、Kafka VS RabbitMQ
檢驗一款訊息佇列的核心效能指標是 系統吞吐量 和系統延遲 。
- 吞吐量測試測量佇列在硬體(特別是磁碟和 CPU)使用方面的效率。
- 延遲測試測量每個系統傳遞實時訊息的差別,這是實時任務關鍵型應用程式以及微服務架構的核心要求。
結論:
吞吐量:Kafka 在三個系統中的吞吐量最高,是 RabbitMQ 的 15 倍,Pulsar 的 2 倍。
系統延遲:Kafka 在較高的吞吐量下提供了最低的延遲,同時還提供了強大的永續性和高可用性。RabbitMQ 可以實現比 Kafka 更低的端到端延遲(在吞吐量低很多的情況下)
二、Kafak的高吞吐和低延遲是怎麼實現的?
- 頁快取技術+磁碟順序寫
Kafka的訊息資料是寫在硬碟上的,保證了訊息資料的可靠性,但寫硬碟還能保證幾十萬條/秒的訊息處理速度,是怎麼做到的?答案是基於作業系統的頁快取和磁碟順序寫來實現的。
頁快取Page Cache—作業系統自己管理的記憶體快取(os cache)。Kafka在寫入訊息時是直接寫入頁快取,然後由作業系統決定什麼時候把頁快取裡的資料刷入磁碟檔案中。這樣一來,訊息寫入效能就變成了寫記憶體,不是在寫磁碟,請看下圖。
常規的磁碟寫入都是隨機寫,隨便找到檔案的某個位置來寫資料,這樣的效能非常差,但是追加檔案末尾按照順序的方式來寫資料的話,其寫入效能跟寫記憶體的效能都相差無幾的。Kafak就是採用順序寫的方案
2.零拷貝技術
解決了寫入問題,那訊息讀取呢?頻繁的從磁碟讀資料然後發給消費者,效能又是如何保證的?Kafka為了解決這個問題,在讀資料的時候是引入零拷貝技術。
先看下圖是常規的硬碟讀寫流程,作業系統讀取硬碟資料後放在OS Cache,然後需要拷貝一次到Kafka程序,然後Kafka再將資料拷貝到Socket快取才能傳送到網絡卡,這樣流程的效能當然沒有保障。
再看下圖, Kafka的設計為直接將作業系統OS Cache中的資料傳送到網絡卡,跳過了兩次拷貝資料的步驟,Socket快取中僅僅會拷貝一個描述符過去,不會拷貝資料到Socket快取,大大提升了資料讀取效能。