怎么保證kafka消費順序?
1、一個topic,只設置一個partition。眾所周知,一個topic可設置多個partition,partition分布在多個server,每個partition有一個leader,多個follower。以此實現寫入高並發。消息可能被寫入任一個partition,所以不能保證多個partition之間消息的存入順序;更不能保證消息的消費順序。
那么kakfa是怎么保證一個partition順序的?
producer發送消息到kafka,kafka給每個生產者一個生產者PID,kafka單個partition保存的消息順序格式即<<PID,TOPIC>,sequnceId>
同一時間先后發送兩條消息到kafka的同一partition,假如第一條message1發送失敗,第二條message2發送成功並保存到kafka;緊接着第一條會重試並發送成功,如果這時partition保存,會造成消息順序混亂。
實際partition不會,判斷的機制是message1=squenceId1,如果message1發送失敗,第二條消息message2=squenceId2過來,判斷當前sequence和sequence2序號差大於1(因為sequence1未保存),會丟棄這條消息;
如果squence2保存了,sequence1又重發了一條,判斷當前sequence1大於squence2,說明是重試的消息,也會丟棄。
2、發送消息可指定(topic, partition, key) 3個參數,即保證同一類消息只發送到同一個partition,保證寫入順序,同時也保證了消費順序。
3、生產者客戶端開啟冪等性配置,broker會自動保證單分區消息不重復。