kafka中訊息資料如何保證按順序消費?WeCoding2019-08-02 16:55:29

關於Kafka保證單partition有序的討論如下:

一、為什麼只保證單partition有序

如果Kafka要保證多個partition有序,不僅broker儲存的資料要保持順序,消費時也要按序消費。假設partition1堵了,為了有序,那partition2以及後續的分割槽也不能被消費,這種情況下,Kafka 就退化成了單一佇列,毫無併發性可言,極大降低系統性能。因此Kafka使用多partition的概念,並且只保證單partition有序。這樣不同partiiton之間不會干擾對方。

二、Kafka如何保證單partition有序?

producer發訊息到佇列時,透過加鎖保證有序。

kafka中訊息資料如何保證按順序消費?

現在假設兩個問題broker leader在給producer傳送ack時,因網路原因超時,那麼Producer 將重試,造成訊息重複。先後兩條訊息傳送。t1時刻msg1傳送失敗,msg2傳送成功,t2時刻msg1重試後傳送成功。造成亂序。

2。解決重試機制引起的訊息亂序

為實現Producer的冪等性,Kafka引入了Producer ID(即PID)和Sequence Number。對於每個PID,該Producer傳送訊息的每個都對應一個單調遞增的Sequence Number。同樣,Broker端也會為每個維護一個序號,並且每Commit一條訊息時將其對應序號遞增。對於接收的每條訊息,如果其序號比Broker維護的序號)大一,則Broker會接受它,否則將其丟棄:

如果訊息序號比Broker維護的序號差值比一大,說明中間有資料尚未寫入,即亂序,此時Broker拒絕該訊息,Producer丟擲InvalidSequenceNumber

如果訊息序號小於等於Broker維護的序號,說明該訊息已被儲存,即為重複訊息,Broker直接丟棄該訊息,Producer丟擲DuplicateSequenceNumber

Sender傳送失敗後會重試,這樣可以保證每個訊息都被髮送到broker

以上只針對單producer partition的有序保證。0。11版本後,kafka引入事務機制可保證producer掛掉重啟後依然保證有序