5 Kafka訊息順序保證

2021-10-01 10:47:13 字數 1031 閱讀 3638

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值的訊息寫入同乙個記憶體佇列 記憶體佇列內的訊息是有序...