Kafka 支持高吞吐量、高度分布式、容錯性強的平臺,能夠以低延遲傳遞消息。
有幾種技術使 Apache Kafka 如此快速:
- 低延遲消息傳遞
- 批量數據和壓縮
- 水平擴展
低延遲消息傳遞
大多數傳統的數據系統使用隨機存取內存(RAM)進行數據存儲,因為RAM提供了極低的延遲。讓我們看看使用RAM的優缺點。
- 優點: 這種方法使它們變得非常快速。
- 缺點: RAM的成本遠高于磁盤,特別是當系統中有數百GBPS的數據流時。
Kafka 避免了隨機存取內存,它通過順序I/O和零拷貝原理實現低延遲消息傳遞。
順序I/O:
Kafka 在存儲和緩存消息時大量依賴文件系統。有一種普遍的看法是“磁盤很慢”,這意味著高尋址時間。想象一下,如果我們可以避免尋址時間,我們可以實現與RAM一樣低的延遲。Kafka 通過順序I/O來實現這一點。
Kafka 的基本概念是日志(log);這是一種僅附加、完全有序的數據結構。
下面是一個演示日志流(隊列)的圖示,生產者以不可變和單調的方式在日志流的末尾追加,而訂閱者/消費者可以維護自己的指針以指示當前消息的處理。
來源:https://kafka.apache.org/intro.html
每當生產者發布一條消息時,它都會收到包含記錄偏移量的確認。第一條發布到分區的記錄的偏移量為0,第二條為1,以此類推,以遞增的順序。消費者從由偏移量指定的位置消費數據,然后定期將其位置保存在日志中以進行提交。保存偏移量的目的是讓另一個消費者在消費者實例崩潰時可以從其位置恢復。
零拷貝原理:
當我們從內存中提取數據并將其發送到網絡時會發生什么。
- 從內存中提取數據,它會將數據從內核上下文復制到應用程序上下文
- 將這些數據發送到互聯網,它會將數據從應用程序上下文復制到內核上下文。
圖像概念來自:https://developer.ibm.com/articles/j-zerocopy/
正如您所看到的,將數據在內核上下文和應用程序上下文之間進行復制是多余的,這會消耗CPU周期和內存帶寬,尤其是在數據量很大時會導致性能下降。這正是零拷貝原則要解決的問題。
圖像概念來自:https://developer.ibm.com/articles/j-zerocopy/
批量數據和壓縮
高效的壓縮需要將多個消息一起壓縮,而不是分別壓縮每個消息。
Kafka 支持這一點,允許遞歸消息集。一批消息可以被聚合在一起壓縮,并以這種形式發送到服務器。這批消息將以壓縮形式寫入,保持在日志中并只能由消費者解壓縮。
假設帶寬為10MB/s,一次性發送10MB數據比逐個發送10000條消息要快得多(假設每條消息占用100字節)。
壓縮會提高消費者的吞吐量,但會增加一些解壓縮成本。
Kafka 支持 GZIP 和 SnAppy 壓縮協議。
水平擴展
首先讓我們了解什么是垂直擴展。假設對于傳統數據庫服務器,當負載增加時,處理的一種方法是添加更多的資源,例如 CPU、RAM、SSD 等。這被稱為垂直擴展。它有一些缺點,如下所示:
- 每臺硬件都有限制,無法無限制地向上擴展
- 如果機器宕機怎么辦?通常需要停機時間
水平擴展通過添加更多的機器來解決相同的問題。
Kafka 具有在數千臺機器之間為單個主題擁有數千個分區的能力,這意味著 Kafka 可以處理大量負載。