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

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

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

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

如何获取? :

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

1、原因分析

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

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

6a0ecde68eea66672b3786fc2adaf3e6.jpg

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

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

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

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

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

9708c453bbfe765151b0cc768f2e3b81.jpg

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

2、解决方案

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

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

7ccd4b50ac8cb48eded17adc9da5f9d4.jpg

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

42150a7e46f229878758eb38d42a5ba1.jpg

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

35c677386f652130b20d430f0783a2ff.jpg

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


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


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

ee90d9963df444db88b33d6e798a5b94.gif

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

相关文章
|
7月前
|
消息中间件 缓存 Java
✈️【Kafka技术专题】「开发实战篇」深入实战探索Kafka的生产者的开发实现及实战指南
✈️【Kafka技术专题】「开发实战篇」深入实战探索Kafka的生产者的开发实现及实战指南
83 0
|
7月前
|
消息中间件 存储 大数据
大数据开发岗面试复习30天冲刺 - 日积月累,每日五题【Day06】——Kafka4
大数据开发岗面试复习30天冲刺 - 日积月累,每日五题【Day06】——Kafka4
71 0
|
7月前
|
消息中间件 存储 数据采集
大数据开发岗大厂面试30天冲刺 - 日积月累,每日五题【Day03】——Kafka1
大数据开发岗大厂面试30天冲刺 - 日积月累,每日五题【Day03】——Kafka1
59 0
|
消息中间件 缓存 NoSQL
手把手教你云相册项目简易开发 day1 Kafka+IDEA+Springboot+Redis+MySQL+libvips 简单运行和使用
手把手教你云相册项目简易开发 day1 Kafka+IDEA+Springboot+Redis+MySQL+libvips 简单运行和使用
227 0
|
6月前
|
消息中间件 Java Kafka
SpringBoot实用开发篇第六章(整合第三方技术,ActiveMQ,RabbitMQ,RocketMQ,Kafka)
SpringBoot实用开发篇第六章(整合第三方技术,ActiveMQ,RabbitMQ,RocketMQ,Kafka)
|
6月前
|
消息中间件 存储 Java
后端开发Spring框架之消息介绍 同步异步 JMS AMQP MQTT Kafka介绍
后端开发Spring框架之消息介绍 同步异步 JMS AMQP MQTT Kafka介绍
46 0
|
7月前
|
消息中间件 Java Kafka
【Spring底层原理高级进阶】Spring Kafka:实时数据流处理,让业务风起云涌!️
【Spring底层原理高级进阶】Spring Kafka:实时数据流处理,让业务风起云涌!️
|
7月前
|
消息中间件 监控 负载均衡
Kafka高级应用:如何配置处理MQ百万级消息队列?
在大数据时代,Apache Kafka作为一款高性能的分布式消息队列系统,广泛应用于处理大规模数据流。本文将深入探讨在Kafka环境中处理百万级消息队列的高级应用技巧。
268 0
|
7月前
|
消息中间件 安全 大数据
大数据开发岗常见面试复习30天冲刺 - 日积月累,每日五题【Day05】——Kafka3
大数据开发岗常见面试复习30天冲刺 - 日积月累,每日五题【Day05】——Kafka3
52 0
|
7月前
|
消息中间件 存储 大数据
大数据开发岗大厂面试30天冲刺 - 日积月累,每日五题【Day04】——Kafka2
大数据开发岗大厂面试30天冲刺 - 日积月累,每日五题【Day04】——Kafka2
66 0

热门文章

最新文章