一个事情5年的粉丝找到我。
他说: “Mic老师,你假如能回答出这个问题,我就佩服你”
我当场就懵了,现在打赌都这么随意了吗?

我问他问题是什么,他说“Kafka如何避免重复消费的问题!
”
下面看看普通人和高手的回答!
视频加载中...
须要高手口试文档(附赠阿里内部十万字口试文档)或者有不懂的技能口试题想咨询的小伙伴可往后台私信【Mic】或者评论区留言。
普通人:
Kafka怎么避免重复消费便是我们可以通过 我们可以在那个消费的这一端便是我们可以用类似于分布式锁的这样一个设计吧。
我消费一个的时候我可以直接用比如说redis里面的setNx这样一个指令,然后去把那个保存到redis里面然后后面再如果重复发送的话那我就直接只要去判断这个Redis里面有没有存在就好了。
高手:
好的,关于这问题,我从几个方面来回答。
首先Kafka Broker上存储的,都有一个Offset标记。
然后kafka的消费者是通过offSet标记来掩护当前已经消费的数据,
每消费一批数据,Kafka Broker就会更新OffSet的值,避免重复消费。
默认情形下,消费完往后,会自动提交Offset的值,避免重复消费。
Kafka消费真个自动提交逻辑有一个默认的5秒间隔,也便是说在5秒之后的下一次向Broker拉取消息的时候提交。
以是在Consumer消费的过程中,运用程序被逼迫kill掉或者宕机,可能会导致Offset没提交,从而产生重复提交的问题。
除此之外,还有其余一种情形也会涌现重复消费。
在Kafka里面有一个Partition Balance机制,便是把多个Partition均衡的分配给多个消费者。
Consumer端会从分配的Partition里面去消费,如果Consumer在默认的5分钟内没办法处理完这一批。
就会触发Kafka的Rebalance机制,从而导致Offset自动提交失落败。
而在重新Rebalance之后,Consumer还是会从之前没提交的Offset位置开始消费,也会导致重复消费的问题。
基于这样的背景下,我认为办理重复消费问题的方法有几个。
提高消费真个处理性能避免触发Balance,比如可以用异步的办法来处理,缩短单个消费的市场。或者还可以调度处理的超时时间。还可以减少一次性从Broker上拉取数据的条数。可以针对天生md5然后保存到mysql或者redis里面,在处理之前先去mysql或者redis里面判断是否已经消费过。这个方案实在便是利用幂等性的思想。以上便是我对这个问题的理解。
总结
重复消费这个问题很主要,如果没有考虑到就会涌现线上的数据问题。
以是在口试的时候,这些问题也能够稽核求职者的技能能力以及实践能力。
其余,关于幂等性的问题,我在前面的视频里面有讲,大家可以自己找一找。
喜好我的作品的小伙伴记得点赞和收藏加关注。
须要高手口试文档(附赠大厂内部十万字口试文档)或者有不懂的技能口试题想咨询的小伙伴可往后台私信【Mic】或者评论区留言。