漫遊Kafka設計篇之訊息傳輸的事務定義(5)

2021-09-08 22:24:56 字數 953 閱讀 6412

之前討論了consumer和producer是怎麼工作的,現在來討論一下資料傳輸方面。資料傳輸的事務定義通常有以下三種級別:

最多一次:訊息不會被重**送,最多被傳輸一次,但也有可能一次不傳輸。

最少一次:訊息不會被漏傳送,最少被傳輸一次,但也有可能被重複傳輸.

精確的一次(exactly once):不會漏傳輸也不會重複傳輸,每個訊息都傳輸被一次而且僅僅被傳輸一次,這是大家所期望的。

大多數訊息系統聲稱可以做到「精確的一次」,但是仔細閱讀它們的的文件可以看到裡面存在誤導,比如沒有說明當consumer或producer失敗時怎麼樣,或者當有多個consumer並行時怎麼樣,或寫入硬碟的資料丟失時又會怎麼樣。kafka的做法要更先進一些。當發布訊息時,kafka有乙個「committed」的概念,一旦訊息被提交了,只要訊息被寫入的分割槽的所在的副本broker是活動的,資料就不會丟失。關於副本的活動的概念,下節文件會討論。現在假設broker是不會down的。

如果producer發布訊息時發生了網路錯誤,但又不確定實在提交之前發生的還是提交之後發生的,這種情況雖然不常見,但是必須考慮進去,現在kafka版本還沒有解決這個問題,將來的版本正在努力嘗試解決。

並不是所有的情況都需要「精確的一次」這樣高的級別,kafka允許producer靈活的指定級別。比如producer可以指定必須等待訊息被提交的通知,或者完全的非同步傳送訊息而不等待任何通知,或者僅僅等待leader宣告它拿到了訊息(followers沒有必要)。

現在從consumer的方面考慮這個問題,所有的副本都有相同的日誌檔案和相同的offset,consumer維護自己消費的訊息的offset,如果consumer不會崩潰當然可以在記憶體中儲存這個值,當然誰也不能保證這點。如果consumer崩潰了,會有另外乙個consumer接著消費訊息,它需要從乙個合適的offset繼續處理。這種情況下可以有以下選擇:

漫遊Kafka設計篇之資料持久化

同步首發,歡迎 不要畏懼檔案系統 kafka大量依賴檔案系統去儲存和快取訊息。對於硬碟有個傳統的觀念是硬碟總是很慢,這使很多人懷疑基於檔案系統的架構能否提供優異的效能。實際上硬碟的快慢完全取決於使用它的方式。設計良好的硬碟架構可以和記憶體一樣快。在6塊7200轉的sata raid 5磁碟陣列的線性...

漫遊Kafka設計篇之資料持久化

不要畏懼檔案系統 kafka大量依賴檔案系統去儲存和快取訊息。對於硬碟有個傳統的觀念是硬碟總是很慢,這使很多人懷疑基於檔案系統的架構能否提供優異的效能。實際上硬碟的快慢完全取決於使用它的方式。設計良好的硬碟架構可以和記憶體一樣快。在6塊7200轉的sata raid 5磁碟陣列的線性寫速度差不多是6...

可消費訊息數量 訊息佇列之Kafka概念篇

1.基本定義 kafka是乙個分布式的 可分割槽的 可複製的訊息系統。它提供了普通資訊系統的功能,但具有自己獨特的設計 2.底層原理 2 topic與訊息 這樣,訊息就以乙個個id的方式,組織起來。consumer選擇乙個topic,通過id指定從哪個位置開始消費訊息。消費完成之後保留id,下次可以...