我們都知道,kafka是依賴於檔案系統來儲存和緩衝訊息的。在其他訊息佇列rabbitmq中,使用的是記憶體作為預設的儲存介質,而磁碟作為備選介質,以此來實現高吞吐和低延遲的效果;redis則是完全依賴於記憶體實現的。那為什麼kafka採用這種持久化的形式還能提供如此有競爭力的效能呢?首先kafka在同乙個topic partition中的資料是有序的 ,kafka設計的時候,就只支援在檔案末尾進行追加,而不支援修改操作,屬於典型的順序寫入操作,作業系統對順序讀寫坐了深層次的優化----預讀和後寫(將乙個大的磁碟塊讀入記憶體,將很多小邏輯的寫操作在記憶體中完成後,一次性將這一塊資料寫入磁碟中)。有相關研究表明,對磁碟的順序寫入速度遠遠大於對磁碟的隨機寫入,甚至還快過了對記憶體的隨機寫入。
kafka在讀取的時候使用了零拷貝技術,降低對檔案的拷貝次數,一定程度上提公升了速度。
前面對讀寫操作的優化,使得kafka能承載吞吐量也不容小視,但這並不是kafka在全域性性能上具備競爭力的全部因素。接下來將介紹的是頁快取,kafka是如何借助作業系統的幫助提公升效能的。
頁快取是作業系統對資料檔案的讀寫提供的一種緩衝技術,目的是為了減少i/o操作的次數。
當程序讀取某個檔案的時候,作業系統會先檢視待讀取的資料所在的頁是否在頁快取中,如果在則直接返回給程序,如果不在則從磁碟讀取後先寫入頁快取,然後再將資料返回給程序。
當程序寫入某個檔案的時候,作業系統也會檢視需要操作的頁是否在頁快取中,如果存在則進行寫入,如果不在則從磁碟中讀取後再進行相關寫入操作,被修改後的頁,作業系統會在合適的時間內刷入磁碟來保證資料的一致性。
雖然kafka的訊息載入到頁快取中後,由作業系統擇機刷入磁碟,但是kafka也還是提供了同步刷盤和間斷性強制刷盤的功能,這些功能可以通過控制引數來實現。同步刷盤確實可以實現資料的可靠性,但是並不建議這樣做,提高訊息的可靠性應該由副本機制來實現,而不是由嚴重損耗效能的同步刷盤來實現。
Kafka為什麼速度快
磁碟讀寫的快慢取決於你怎麼使用它,也就是順序讀寫或者隨機讀寫。在順序讀寫的情況下,磁碟的順序讀寫速度和記憶體持平。如果不刪除硬碟肯定會被撐滿,所以kakfa提供了兩種策略來刪除日誌 log.cleanup.policy配置 1 基於時間 檢查當前日誌檔案中是否有保留時間超過設定的閾值來尋找可刪除的日...
kafka 為什麼快
一般的 mq 每個訊息都有乙個狀態,這樣每個訊息狀態改變都要更新,增加了很多隨機讀寫。kafka 對每個 partition 只有乙個指標,而不是儲存每個訊息的狀態,所有在指標後面的訊息都是被消費過的訊息。這就去掉了很多 確認訊息 動作的隨機讀寫,通過一次移動指標,來確認多個訊息。很多訊息中介軟體,...
Redis為什麼那麼快
前言redis是基於鍵值對的nosql資料庫,redis的value可以由string,hash,list,set,zset,bitmaps,hyperloglog等多種資料結構和演算法組成。redis還提供了鍵過期,發布訂閱,事務,lua指令碼,哨兵,cluster等功能。redis執行命令非常快...