kafka訊息順序保證
kafka分布式的單位是partition,同乙個partition用乙個write ahead log組織,所以可以保證fifo的順序。不同partition之間不能保證順序。
絕大多數使用者都可以通過message key來定義,因為同乙個key的message可以保證只傳送到同乙個partition,比如說key是user id,table row id等等,所以同乙個user或者同乙個record的訊息永遠只會傳送到同乙個partition上,保證了同乙個user或record的順序。
同乙個partition只會被消費者組中的乙個消費者消費,保證消費有序性。
但是對資料有序性有嚴格要求,建議:
建立topic時只指定1個partition,這樣就失去kafka優秀的特性
kafka本身適合流式大資料量,要求高吞吐,對資料有序性要求不嚴格的場景
注意事項
訊息重試對順序訊息的影響
對於乙個有著先後順序的訊息a、b,正常情況下應該是a先傳送完成後再傳送b,但是 在異常情況下,在a傳送失敗的情況下,b傳送成功,而a由於重試機制在b傳送完成之後重試傳送成功了。這時對於本身順序為ab的訊息順序變成了ba
訊息producer傳送邏輯的控制
訊息producer在傳送訊息的時候,對於同乙個broker連線是存在多個未確認的訊息在同時傳送的,也就是存在上面場景說到的情況,雖然a和b訊息是順序的,但是由於存在未知的確認關係,有可能存在a傳送失敗,b傳送成功,a需要重試的時候順序關係就變成了ba。簡之一句就是在傳送b時a的傳送狀態是未知的。
針對以上的問題,嚴格的順序消費還需要以下引數支援: max.in.flight.requests.per.connection
在傳送阻塞前對於每個連線,正在傳送但是傳送狀態未知的最大訊息數量。如果設定大於1,那麼就有可能存在有傳送失敗的情況下,因為重試傳送導致的訊息亂序問題。設定為1,這樣生產者在嘗試傳送第乙個批次的訊息時,就不會有其他的訊息傳送給 broker,但是吞吐量會下降。
5 Kafka訊息可靠性
在訊息中介軟體裡,有乙個非常重要的問題就是怎麼保證訊息不丟失,而這就是訊息的可靠性問題。1 acks 這個引數用於控制producer生產訊息的永續性。當一條訊息被提交,只要有任何乙個副本儲存了該訊息,並且副本存活,那麼就可以認為該訊息是不可丟失的。當producer傳送一條訊息給kafka集群時,...
kafka保證訊息順序性
順序保證 kafka 可以保證同乙個分割槽裡的訊息是有序的。也就是說,如果生產者按照一定的順序傳送訊息,broker 就會按照這個順序把它們寫入分割槽,消費者也會按照同樣的順序讀取它們。1.單分割槽 2.如果把 retries 設為非零整數,必須把 max.in.flight.requests.pe...
Kafka 訊息佇列如何保證順序性?
主要思路 相同key值的訊息寫入同乙個partition partition內的訊息是有序的 乙個partition的訊息只會被乙個消費者消費。如果乙個消費者是多個執行緒消費,則需要把pull來的訊息按照key值寫入不同的記憶體佇列中,相同key值的訊息寫入同乙個記憶體佇列 記憶體佇列內的訊息是有序...