这个问题,就是看你对kafka的掌握程度;kafka消息投递的可靠性就是保证消息不丢,那消息从生产端到消费端,这中间有哪些环节都要考虑到
producer
生产者主要通过 ACK + 重试 + 幂等 来保证
ACK机制
acks=0,Producer发送完就认为成功,不等待Broker响应
acks=1,Leader写入成功就返回,不等follower同步
acks=all,所有ISR副本写入成功才返回,只要ISR中有副本存活,消息就不会丢
1 | acks=all //所有ISR副本写入成功才返回 |
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,但可能导致数据丢失