Plantre Plantre
首页
后端
技术
硬件
  • 前端文章

    • HTML
    • CSS
    • JavaScript
  • 技术

    • 技术文档
    • GitHub技巧
    • Nodejs
    • 博客搭建
  • 学习笔记

    • 《JavaScript教程》
    • 《JavaScript高级程序设计》
    • 《ES6 教程》
    • 《Vue》
    • 《React》
    • 《TypeScript 从零实现 axios》
    • 《Git》
    • TypeScript
    • JS设计模式总结
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

plantre

一个后端开发者
首页
后端
技术
硬件
  • 前端文章

    • HTML
    • CSS
    • JavaScript
  • 技术

    • 技术文档
    • GitHub技巧
    • Nodejs
    • 博客搭建
  • 学习笔记

    • 《JavaScript教程》
    • 《JavaScript高级程序设计》
    • 《ES6 教程》
    • 《Vue》
    • 《React》
    • 《TypeScript 从零实现 axios》
    • 《Git》
    • TypeScript
    • JS设计模式总结
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 计算机组成原理

  • 操作系统

  • 计算机网络

  • 设计模式

  • Java

  • Spring

  • SpringCloud

  • MySQL

  • Redis

  • 分布式

  • Zookeeper

  • Dubbo

  • Kafka

    • Kafka的架构
    • docker搭建Kafka集群
    • spring关于kafka的最全配置
    • kafka分主副节点吗
    • kafka的 topic, key , 分区的关系,以及数量对应关系,以及默认值
    • spring项目是事先创建topic还是代码里创建
    • 一个topic一般创建几个分区,几个副本数,只有三个broker的话又是怎么分布的
    • 一共有3个broker,一个topic有10个分区,副本数最大为3?分区又是怎么分布在3个broker上的?用的什么算法
    • 副本数和分区数什么区别
    • 我还是不明白副本数,请画出具体的分布图,3个broker,某个topic10个分区
    • Leader+​​Follower = 副本数?
    • ​​ISR(In-Sync Replicas)是什么,最多有多少个,这个数量怎么得来的
    • 在 Spring Kafka 中发送消息
    • 向kafka中发送重复的数据会怎么样
      • send消息时,key有什么用?
    • 数据结构

    • 算法

    • OJ

    • 从道家哲学看计算机?
    • 后端
    • Kafka
    plantre
    2025-06-23
    目录

    向kafka中发送重复的数据会怎么样

    向 Kafka 中发送重复的数据会导致消息被多次存储或消费,具体结果取决于 Kafka 的配置和消息处理策略。以下是不同场景下的核心影响及解决方案:


    # ⚠️ 一、无防护机制时:消息必然重复

    1. 生产者重试机制导致重复

      • 原因:当生产者发送消息后未收到 Broker 的确认(如网络抖动、Broker 故障),会触发重试机制,导致同一条消息被多次发送。
      • 表现:Broker 会将重复消息视为独立消息存储,消费者可能多次消费相同数据。
    2. 数据乱序问题

      • 若重试消息与后续消息顺序错乱(如消息1失败重发时,消息2已写入),Broker 存储顺序变为 消息2 → 消息1,破坏业务逻辑。

    # 🛡️ 二、Kafka 内置防重复机制

    # 1. 幂等性生产者(Idempotence)

    • 原理:
      • 每个生产者分配唯一 PID,每条消息绑定分区级单调递增序列号 SequenceNumber。
      • Broker 缓存最近5个序列号,拒绝重复或乱序的序列号(如 seq_num ≤ 缓存最大值)。
    • 配置:
      spring.kafka.producer.properties.enable.idempotence=true
      spring.kafka.producer.acks=all           # 必须设为 all
      max.in.flight.requests.per.connection≤5  # 避免乱序
      
      1
      2
      3
    • 局限:仅保证单分区、单会话(生产者重启后失效)的消息不重复。

    # 2. 事务(Transactions)

    • 原理:
      • 跨分区原子写入:事务内多条消息要么全部提交,要么全部丢弃。
      • 通过 transactional.id 关联生产者会话,重启后仍能防重复。
    • 配置:
      props.put("transactional.id", "tx-producer-1");
      producer.initTransactions();
      try {
          producer.beginTransaction();
          producer.send(record1);
          producer.send(record2);
          producer.commitTransaction();
      } catch (Exception e) {
          producer.abortTransaction();
      }
      
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
    • 优势:支持多分区、跨会话的精确一次语义(Exactly-Once)。

    # 🔄 三、消费者端重复消费及应对

    1. 重复消费原因

      • 消费者提交 Offset 前崩溃,重启后从旧 Offset 重新拉取消息。
      • 即使生产者防重复,消费者仍可能因提交失败收到重复消息。
    2. 解决方案

      • 消费者幂等设计:
        • 唯一键去重:利用数据库唯一约束(如联合业务ID)。
          ALTER TABLE orders ADD UNIQUE (tx_id, user_id);  -- 重复插入抛异常
          
          1
        • 状态检查:用 Redis 记录已处理消息ID(如 SETNX message_id 1)。
      • 事务型消费者:
        • 配合 Kafka 事务,设置 isolation.level=read_committed,仅读取已提交事务的消息。

    # 💎 四、最佳实践总结

    场景 配置方案 效果
    单分区防重复 启用幂等性 + acks=all + max.in.flight≤5 单会话内无重复、无乱序
    多分区/跨会话防重复 启用事务 + transactional.id 原子写入、重启不重复
    消费者端防重复 业务幂等设计(DB唯一键/Redis缓存) 兜底去重,兼容所有场景

    生产环境建议:

    • 关键业务:生产者事务 + 消费者幂等 双重保障。
    • 高吞吐场景:启用幂等性,牺牲部分灵活性换取性能。
    • 日志类数据:可接受 acks=1,容忍少量重复以提升吞吐量。

    通过合理配置 Kafka 的幂等性和事务,结合消费者端的业务幂等设计,可有效解决重复消息问题,实现从生产到消费的端到端精确一次处理(Exactly-Once)。

    编辑 (opens new window)
    上次更新: 2025/06/24, 00:41:57
    在 Spring Kafka 中发送消息
    send消息时,key有什么用?

    ← 在 Spring Kafka 中发送消息 send消息时,key有什么用?→

    最近更新
    01
    集成loki
    07-04
    02
    TCP的ESTABLISHED是什么意思
    06-24
    03
    安装1panel
    06-24
    更多文章>
    Theme by Vdoing | Copyright © 2025-2025 plantre | MIT License
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式