6年高级开发就因这道题少了5K,Kafka如何避免消息重复消费?

一个6年工作经验的小伙伴,被问到这样一个问题,说Kafka是如何避免消息重复消费的?面试完之后,这位小伙伴来找到我,希望我能给一个思路。今天,我给大家分享一下我的思路。

另外,我花了1个多星期,准备了一份500页的PDF面试题解析配套文档,

如何获取? :

扫描文章底部二维码领取!

1、原因分析

我认为,导致Kafka消息重复消费有以下两个原因:

第1个原因是:Kafka消费端重复提交导致消息重复消费。

如图所示,在Broker上存储的消息,都有一个Offset标记,用来记录消费者消费消息的位置。Kafka的消费者是通过offSet标记来维护当 前已经消费的数据,每消费一批数据,Broker就会更新offSet的值,避免重复消费。

而默认情况下,消息消费完以后,会自动提交Offset的值,避免重复消费。

但是Kafka消费端的自动提交,会有一个默认的5秒间隔,也就是说在5秒之后的下一次向Broker拉取消息的时候才提交上一批消费的offset。

所以在消费者消费的过程中,如果遇到应用程序被强制kill掉或者宕机的情况,可能会导致Offset没有及时提交,从而产生重复提交的问题。

第2个原因是:Kafka服务端的Partition再均衡机制导致消息重复消费。

如图所示,在Kafka中有一个Partition Balance机制,就是把多个Partition均衡的分配给多个消费者。消费端会从分配到的Partition里面去消费消息,如果消费者在默认的5分钟内没有处理完这一批消息。就会触发Kafka的Rebalance机制,从而导致offset自动提交失败。而Rebalance之后,消费者还是会从之前没提交的offset位置开始消费,从而导致消息重复消费。

2、解决方案

基于对Kafka消息重复消费的原因分析,我认为可以通过以下两个方法来解决这个问题:

基于这样的背景下,我认为解决重复消费消息问题的方法有几个。

  1. 提高消费端的处理性能避免触发Balance,比如可以用多线程的方式来处理消息,缩短单个消息消费的时长。或者还可以调整消息处理的超时时间,也还可以减少一次性从Broker上拉取数据的条数。

  1. 使用ConsumerRebalanceListener,再均衡监听器,它可以用来设定发生再均衡动作前后的一些准备或者收尾工作。

  1. 开启Kafka的冥等性功能prop.put(ProducerConfig.ENABLE_IDEMPOTENCE_CONFIG,true);

或者将消息生成md5然后保存到MySQL或者Redis中,在处理消息之前先查MySQL或者Redis,进行判断看是否已经消费过。

以上就是我对Kafka避免消息重复消费的解决思路,小伙伴如果更好的思路也可以在评论区讨论一下。

我是被编程耽误的文艺Tom,只弹干货不掺水!你们的支持就是我最大的动力!关注我,面试不再难!

完整版面试资料和答案以及PDF文档 :

扫描下方二维码领取!

↓     ↓     ↓

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
Kafka消息重复消费问题,可以通过以下几种方法来避免: 1. Consumer group机制:Kafka通过consumer group机制来保证同一个分区内的消息只会被同一个消费者组的一个消费消费。因此,如果在同一个消费者组中,同一条消息只会被消费一次。 2. 自动提交offset:Kafka提供了自动提交offset的机制,可以在消息被处理后自动将offset提交给Kafka。这样可以确保消息不会被重复消费,因为Kafka会记住每个消费消费的offset,一旦消费者重启,就可以从上一次提交的offset继续消费。 3. 手动提交offset:手动提交offset是另一种避免消息重复消费的方法。在处理完一批消息后,消费者可以手动将offset提交给Kafka,这样可以确保下一次消费者从正确的位置开始消费。 4. 使用消息去重:在消费者端可以使用消息去重的方法,比如将消息ID保存在Redis中,每次消费时先判断Redis中是否已经存在该消息ID,如果存在,则跳过该消息,否则处理该消息。 5. 使用事务机制:Kafka提供了事务机制,可以将消息消费和业务处理放在一个事务中,如果消息消费失败,则整个事务回滚,保证消息不会被重复消费。 总之,避免Kafka消息重复消费的关键在于正确使用consumer group机制、手动/自动提交offset、消息去重和事务机制等方法,具体方法需要根据实际业务场景进行选择。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Tom弹架构

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值