1. 保證分區消息的順序。同一個生產者給同一個分區寫消息必定是有序的linux
2. 全部的同步副本寫入了消息時,纔會被認爲已經提交出現場景多是
1. 假設3個副本,2個副本掛了,首領副本正常運行,這時候首領副本也掛了,隨後啓動了新的副本,數據不一樣步;
2. 3個副本中,首領副本正常,可是因爲網絡延遲跟隨副本複製存在必定的延遲,若是首領副本掛了,其它副本都是不一樣步的3. 最少同步副本。當分區同步副本數少於最少同步副本的時候,就中止接受生產者的消息,拋出異常。以免不徹底選舉所產生的數據寫入與讀出預期不一致的狀況
於是須要考慮兩個方面:算法
1. 是acks的設置,不過須要處理吞吐量和消息丟失的關係數據庫
ack越多丟失機率越小,可是吞吐量少,得等待收到全部的
2. 是生產者的重試機制,對於可重試的採用kafka內部的重試機制,不可重試的錯誤考慮保存到其它地方,後續進入.api
重試帶來的風險是消息重複
零拷貝依賴於操做系統。kafka中存在大量數據持久化道磁盤和磁盤文件經過網絡發送。傳統的方式來講,經歷4次拷貝。首先系統將調用文件數據讀到內存態Buffer,而後應用程序將內核態讀入到用戶態buffer,接着用戶經過socket發送數據將用戶態拷貝到內核態buffer,最後經過DMA拷貝將數據拷貝到NIC 【4次上下文切換】,在linux2.4+操做系統,sendfile系統調用經過零拷貝,數據從DMA拷貝到NIC Buffer,無需CPU拷貝網絡
零拷貝來源,只有兩次上下文切換
每一個主題能夠配置保留時長或者大小。每一個分區會有若干個片斷,當前寫入數據的片斷(活躍片斷),永遠不會被刪除,假如配置了保留5天的數據,那麼會保留5天負載均衡
默認1G或者一週,以小的爲準,一個片斷數據滿了則關閉當前文件,打開新的,方便查找和刪除
儲存格式與生產者發送,發送給消費者的格式一致。消息裏不只包含建和值,同時有大小,檢驗和,版本,壓縮算法,時間戳
socket
應用程序發送一個相同的鍵,可是值爲null的消息【稱爲墓碑消息】,進行常規清理時,只保留null消息,一段時間後,消費者消費時發現null的記錄,知曉應該從數據庫中刪除,這段時間後,清理線程便清理掉墓碑消息操作系統
消費者若是離線了就幹不掉了
適用場景:消息中存在同樣的key,可是隻須要保留最新的key的value。執行compact的時候,會早內存中構建一個map,key是消息鍵的hash,值是消息鍵的偏移量,讀取必定量的污濁消息每一個片斷後,若是當前的消息key存在且偏移量小,值過時,或者是null,就拋棄,不然保存線程