色婷婷狠狠18禁久久YY,CHINESE性内射高清国产,国产女人18毛片水真多1,国产AV在线观看

kafka中消息數(shù)據(jù)如何保證按順序消費(fèi)?

關(guān)于Kafka保證單partition有序的討論如下:

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

如果Kafka要保證多個(gè)partition有序,不僅broker保存的數(shù)據(jù)要保持順序,消費(fèi)時(shí)也要按序消費(fèi)。假設(shè)partition1堵了,為了有序,那partition2以及后續(xù)的分區(qū)也不能被消費(fèi),這種情況下,Kafka就退化成了單一隊(duì)列,毫無并發(fā)性可言,極大降低系統(tǒng)性能。因此Kafka使用多partition的概念,并且只保證單partition有序。這樣不同partiiton之間不會(huì)干擾對(duì)方。

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

  1. producer發(fā)消息到隊(duì)列時(shí),通過加鎖保證有序。
    現(xiàn)在假設(shè)兩個(gè)問題brokerleader在給producer發(fā)送ack時(shí),因網(wǎng)絡(luò)原因超時(shí),那么Producer將重試,造成消息重復(fù)。先后兩條消息發(fā)送。t1時(shí)刻msg1發(fā)送失敗,msg2發(fā)送成功,t2時(shí)刻msg1重試后發(fā)送成功。造成亂序。

2.解決重試機(jī)制引起的消息亂序

為實(shí)現(xiàn)Producer的冪等性,Kafka引入了ProducerID(即PID)和SequenceNumber。對(duì)于每個(gè)PID,該P(yáng)roducer發(fā)送消息的每個(gè)<Topic,Partition>都對(duì)應(yīng)一個(gè)單調(diào)遞增的SequenceNumber。同樣,Broker端也會(huì)為每個(gè)<PID,Topic,Partition>維護(hù)一個(gè)序號(hào),并且每Commit一條消息時(shí)將其對(duì)應(yīng)序號(hào)遞增。對(duì)于接收的每條消息,如果其序號(hào)比Broker維護(hù)的序號(hào))大一,則Broker會(huì)接受它,否則將其丟棄:

  • 如果消息序號(hào)比Broker維護(hù)的序號(hào)差值比一大,說明中間有數(shù)據(jù)尚未寫入,即亂序,此時(shí)Broker拒絕該消息,Producer拋出InvalidSequenceNumber
  • 如果消息序號(hào)小于等于Broker維護(hù)的序號(hào),說明該消息已被保存,即為重復(fù)消息,Broker直接丟棄該消息,Producer拋出DuplicateSequenceNumber
  • Sender發(fā)送失敗后會(huì)重試,這樣可以保證每個(gè)消息都被發(fā)送到broker

以上只針對(duì)單producerpartition的有序保證。0.11版本后,kafka引入事務(wù)機(jī)制可保證producer掛掉重啟后依然保證有序