Kafka是大型架构核心,下面我详解Kafka如何保证消息不丢失@mikechen
副本机制
Kafka 将每个分区的数据在集群内复制到多个 Broker 上,形成多个副本(replica)。

其中一个副本被选为领导者(leader),其余为追随者(follower)。
当领导者接收写入请求时,会将数据复制到追随者。
副本机制确保某一节点故障时,其他副本可以继续提供数据,从而防止因单点故障导致的数据丢失。
ACK 策略与 ISR
生产者,在发送消息时可以指定 ACK 级别(acks)。
比如:acks=0(不等待确认)、acks=1(等待领导者确认)、acks=all(等待所有 ISR 中的副本确认)。

配合 ISR 列表(只有与领导者保持同步的副本列入 ISR),使用 acks=all 可确保消息在被认为已提交前。
至少被所有同步副本持久化,从而显著降低已确认消息丢失的概率。
持久化与刷新策略
Kafka 将消息,持久化到磁盘日志(segment files)。
通过操作系统页缓存、和文件系统刷新机制来管理写入。

生产者可开启幂等性、或事务性,写入以确保写入顺序和原子性。
Broker 端可以配置 fsync 、或者依赖操作系统异步刷新策略以平衡性能与持久性需求。
合理配置日志刷新策略与分区副本持久化,能够确保在崩溃或电源故障时已写入的数据不会丢失。
幂等性与事务
Kafka 提供生产者端的幂等性支持,确保因重试导致的重复写入不会产生不一致结果。

基于幂等性的事务功能,允许多个分区/和多个写入操作以原子方式提交或回滚,适用于跨分区的严格一致性场景。
结合消费者端的位移提交(offset commit)与事务,系统可以在失败恢复后。
精确做到“至少一次”或“正好一次”语义,避免消息漏处理或重复处理带来的数据不一致。
mikechen睿哥
10年+一线大厂架构实战经验,操盘多个亿级大厂核心项目,就职于阿里、淘宝等一线大厂。