3 kafka怎么保证你投递消息的可靠性

vvEcho 2026-03-13 10:44:21
Categories: Tags:

这个问题,就是看你对kafka的掌握程度;kafka消息投递的可靠性就是保证消息不丢,那消息从生产端到消费端,这中间有哪些环节都要考虑到

producer

生产者主要通过 ACK + 重试 + 幂等 来保证

ACK机制
acks=0,Producer发送完就认为成功,不等待Broker响应
acks=1,Leader写入成功就返回,不等follower同步
acks=all,所有ISR副本写入成功才返回,只要ISR中有副本存活,消息就不会丢

1
2
3
4
acks=all //所有ISR副本写入成功才返回
retries=3 //重试3次
enable.idempotence=true //开启幂等生产者
max.in.flight.requests.per.connection=5

Brocker

brocker通过副本机制来确保消息不丢失
每个分区都有一个leader和若干follower
ISR
Kafka 只允许 ISR中的副本参与确认。ISR指的是同步副本集合,落后的副本会从ISR剔除,Producer的ack只会等ISR副本的确认
min.insync.replicas=2 最小同步副本数,意思是至少2个副本成功才算写入成功

Consumer 如何保证不丢消息

消费者关键是 offset 提交策略,enable.auto.commit=true自动提交不推荐
需要为手动提交consumer.commitSync(),手动提交如果宕机会自动

Kafka 消费流程:
消费消息

处理业务

提交offset

kafka整体可靠性总结

Producer

ACK机制 + 重试 + 幂等

Kafka Broker

Replication + ISR

Consumer

手动提交offset

kafka怎么保证消息不重复消费

kafka本身不保证消费重复消费的,需要交给业务系统自己处理重复消费的逻辑

可以在消息体中增加消息唯一标识,比如订单id等;业务系统对消息打标

Kafka Leader 挂了之后如何选新 Leader 才不会丢数据?

Kafka 通过 ISR 机制保证 Leader 切换不会丢数据。

每个 partition 都有一个 ISR(In-Sync Replicas)集合,表示与 Leader 数据保持同步的副本。

当 Leader 挂掉时:

Kafka Controller 会检测到 Leader 失效

只会从 ISR 集合中选择新的 Leader

因为 ISR 副本的数据与 Leader 保持一致,所以不会丢数据

如果 ISR 为空:

默认情况下 Kafka 不会进行选举,partition 会暂时不可用

如果开启 unclean.leader.election.enable=true,Kafka 可以从落后副本选 Leader,但可能导致数据丢失