高级java面试题:kafka如何保证消费顺序


怎么保证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会自动保证单分区消息不重复。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM