kafka中訊息資料如何保證按順序消費?
關於Kafka保證單partition有序的討論如下:
一、為什麼只保證單partition有序
如果Kafka要保證多個partition有序,不僅broker儲存的資料要保持順序,消費時也要按序消費。假設partition1堵了,為了有序,那partition2以及後續的分割槽也不能被消費,這種情況下,Kafka 就退化成了單一佇列,毫無併發性可言,極大降低系統性能。因此Kafka使用多partition的概念,並且只保證單partition有序。這樣不同partiiton之間不會干擾對方。
二、Kafka如何保證單partition有序?
producer發訊息到佇列時,透過加鎖保證有序。
現在假設兩個問題broker leader在給producer傳送ack時,因網路原因超時,那麼Producer 將重試,造成訊息重複。先後兩條訊息傳送。t1時刻msg1傳送失敗,msg2傳送成功,t2時刻msg1重試後傳送成功。造成亂序。
2。解決重試機制引起的訊息亂序
為實現Producer的冪等性,Kafka引入了Producer ID(即PID)和Sequence Number。對於每個PID,該Producer傳送訊息的每個
如果訊息序號比Broker維護的序號差值比一大,說明中間有資料尚未寫入,即亂序,此時Broker拒絕該訊息,Producer丟擲InvalidSequenceNumber
如果訊息序號小於等於Broker維護的序號,說明該訊息已被儲存,即為重複訊息,Broker直接丟棄該訊息,Producer丟擲DuplicateSequenceNumber
Sender傳送失敗後會重試,這樣可以保證每個訊息都被髮送到broker
以上只針對單producer partition的有序保證。0。11版本後,kafka引入事務機制可保證producer掛掉重啟後依然保證有序