当前位置: 首页 > article >正文

大厂面试真题:如何保证Kafka的消息不被重复消费

重复消费的原因

1. 客户端自动提交Offset

Kafka默认的自动提交Offset会有一个5秒钟的时间间隔,也就是消费完消息5秒钟之后在下次向broker拉取消息的时候才会提交Offset,而在这个过程中如果应用被强制Kill或者宕机的时候可能会导致Offset没有提交从而产生重复消费的问题。

2. 服务端的分区再平衡(Partition Rebalancing)

分区再平衡是指在消费者组中,当消费者实例的数目发生变化(如新的消费者加入或现有消费者离开)时,Kafka自动重新分配主题分区给消费者的过程。这个过程确保了每个消费者都能公平地分担工作负载,并在有消费者加入或离开时,能够及时调整分区的分配,从而维持系统的高可用性和负载均衡。

消费者与协调者(coordinator)之间通过心跳机制来维护其活跃状态。如果消费者在配置的max.poll.interval.ms时间内(默认值为300000毫秒,即5分钟)没有向协调者发送心跳或请求数据,协调者会认为该消费者已经死亡,从而触发Rebalance操作。如果Consumer在Rebalance发生前没有成功提交Offset,并且在Rebalance后从之前未提交的Offset位置开始消费,会导致消息重复消费。

怎么解决重复消费

Kafka通过一系列机制来确保消息不被重复消费,这些机制涵盖了消费者配置、消费者组协调、幂等性生产者以及消息处理过程中的去重技术等。以下是Kafka保证消息不重复消费的主要方式:

1. 提高消费端的处理性能避免触发reblance

  • 使用多线程方式处理消息,缩短单个消息的处理时长
  • 调整消息的超时时间
  • 减少一次性从broker上拉取数据的条数

2. 使用ConsumerRebalanceListener(再均衡监听器)

  • 再均衡监听器用来设置发生再均衡动作前后的一些准备工作或者收尾工作

3. 幂等性校验

  • 开启幂等性功能:prop.put(ProducerConfig.ENABLE_IDEMPOTENCE_CONFIG, true)是在Kafka生产者的配置中进行的。这一步骤通常在创建Kafka生产者实例之前完成,用于设置生产者的行为以确保消息的幂等性。幂等性指的是对于Kafka生产者发送的相同消息(这里的“相同”指的是重试的消息,而不是内容完全相同的数据),无论发送多少次,Kafka都只会存储一条。

4. 消息去重技术

  • 消息唯一标识符:在消息的生产端或消费端,可以为每条消息添加一个全局唯一的标识符(如订单ID、UUID等)。在消费消息时,消费者可以先检查该消息的唯一标识符是否已经存在于已处理的记录中,如果存在则跳过该消息,从而避免了重复消费。
  • 应用程序层面的去重:在应用程序层面,可以通过维护一个已处理消息的记录或使用外部存储(如数据库、Redis等)来实现消息的去重。在消费消息前,先检查该消息是否已经被处理过,如果已经处理过,则不进行后续处理。

5. 监控和告警

  • 性能监控和告警:通过监控Kafka的性能指标(如消费者的消费速度、偏移量提交情况、Kafka队列大小等)和设置告警阈值,可以及时发现和处理潜在的重复消费问题。当达到告警阈值时,可以通过短信、邮件等方式及时通知相关人员进行处理。

http://www.kler.cn/news/316385.html

相关文章:

  • Laravel接口中实现WebSocket服务消息发送PHP中使用socket扩展搭建WebSocket服务
  • 网站自动识别使用设备
  • React 知识框架
  • SIP信令的基本流程
  • Android架构组件: MVVM模式的实战应用与数据绑定技巧
  • 低空经济刚需篇:各种道路不畅地区无人机吊装详解
  • Stable Diffusion 优秀博客转载
  • 【方案】智慧消防建设规划方案(PPT)
  • 富格林:积攒经验阻挠欺诈套路
  • 公用代码片码抽取需要不断的强化代码复用意识
  • 【高效且应用广泛的排序 —— 快速排序算法】
  • 如何让程序等待输入
  • springboot 整合酷狗获取MV视频最高画质(使用自己账户)
  • 2024人工智能结课作业-DFS/BFS/Astar解决数码问题
  • Linux主流Web服务器:你选择哪一款?
  • 华为---以太网静态路由配置使用下一跳通信正常,而使用出接口无法通信
  • React项目实战(React后台管理系统、TypeScript+React18)
  • 锤炼核心技能以应对编程革命
  • threejs加载高度图渲染点云,不支持tiff
  • 【Linux:共享内存】
  • C# 从字符串中分离文件路径、文件名及扩展名
  • C# winforms DataGridView设置数据源自动显示表格
  • Go 第二期
  • 界面控件Telerik UI for WinForms 2024 Q3概览 - 支持合并单元格等
  • (已解决)vscode如何选择python解释器
  • 【学习笔记】SSL/TLS安全机制之HSTS
  • apt-get install 安装的tomcat配置
  • biopython提取.cif文件的变换矩阵
  • spring全家桶使用教程
  • Kotlin 操作符 in 的基本使用(十)