一、Kafka 如何保证数据不丢失

1)生产端(Producer)不丢数据

关键点:必须等 Kafka 确认写入成功

1.acks 参数
  • acks=1:Leader 写入即确认(可能丢)

  • acks=all 或 -1:Leader + 所有 ISR 副本都写入才成功

  • → 这是不丢数据的核心

2.重试机制
  • retries > 0 + 合理超时
  • 避免网络抖动导致误以为发送失败
3.幂等性 producer
  • enable.idempotence=true
  • 防止重试导致重复发送
4.事务 producer(可选)
  • 跨分区、跨会话的 Exactly-once 语义
生产端不丢的最简配置: acks=all + 重试 + 幂等

2)Kafka 服务端(Broker)不丢数据

关键点:副本机制 + 刷盘策略

1.副本因子 replication.factor >= 3
  • 至少 1 主 N 从
2.ISR 机制
  • 只有跟得上 Leader 的副本才在 ISR 里
  • min.insync.replicas >= 2
  • → 保证至少有 2 个副本写入成功
3.刷盘策略
  • Kafka 默认异步刷盘,靠多副本保证可靠性,不靠刷盘
  • 真要极稳:可调整刷盘参数,但会牺牲性能
4.不允许 unclean 选举
  • unclean.leader.election.enable=false
  • 避免 ISR 外的落后副本被选为 Leader 丢数据
Broker 不丢核心:
多副本 + ISR + 禁止脏选举

3)消费端(Consumer)不丢数据

关键点:先消费,再提交偏移量

1.关闭自动提交
  • enable.auto.commit=false
2.手动提交 offset
  • 业务处理成功后,再手动 commit
  • 失败则不提交,下次重新消费
3.消费失败处理
  • 重试队列 / 死信队列(DLQ)
  • 不要直接吞异常丢消息
消费端不丢核心:
手动提交 + 业务成功再 commit

二、Kafka 为什么这么快?

核心一句话:
顺序读写 + 页缓存 + 零拷贝 + 批量压缩 + 分区并发

1)磁盘顺序写,比随机内存还快

  • Kafka 几乎只做顺序追加写

  • 磁盘顺序读写速度 ≈ 内存随机读写

  • 不删不改,只追加,极快

2)大量使用操作系统 PageCache

  • 数据先写内存页缓存,不是直接落盘
  • 读数据优先读内存,不碰磁盘
  • 生产消费都在内存交互,极快

3)零拷贝(Zero-Copy)

  • 数据直接从文件通道 → 网卡
  • 不经过用户态 / 内核态多次拷贝
  • 少 CPU、少内存拷贝、少 IO

4)批量发送、批量拉取

  • Producer 批量攒消息再发送
  • Consumer 批量拉取
  • 减少网络 IO 次数,提升吞吐量

5)消息压缩

  • 支持 gzip、snappy、lz4、zstd
  • 批量压缩,网络传输量大幅下降

6)分区并发(Partition)

  • 一个 Topic 多分片
  • 多 Producer、多 Consumer 并行读写
  • 水平扩展,线性提升速度

7)无锁 / 轻锁设计

  • 底层数据结构简单:日志文件 + 索引
  • 几乎无锁竞争,高并发下依然快
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐