分布式与消息队列 · 主观题 · 第 64 题
Java 后端开发面试 · 第 64 题
如何保证消息队列中的消息不丢失?请从生产者、Broker、消费者三个环节说明(可以以 Kafka 为例)。
参考答案
1. 生产者:使用带回调的发送或同步发送,失败时重试;Kafka 使用 acks=all 并开启幂等(enable.idempotence=true;Kafka 3.0 起两者都是默认值,注意不要被改回);业务关键消息可以先写本地消息表,再由后台任务补偿发送。
2. Broker:多副本,replication.factor ≥ 3;min.insync.replicas ≥ 2,与 acks=all 配合;unclean.leader.election.enable=false,不让落后的副本当选 leader;RocketMQ 可以用同步刷盘加同步复制。
3. 消费者:关闭自动提交位移,业务处理成功后再手动提交;处理失败就重试,多次失败的消息进入死信队列并告警。
4. 代价:「不丢」通常意味着「可能重复」,所以消费端必须做幂等。
5. 监控:消费积压(lag)、发送失败率、死信数量。
解析
三个环节各答出一到两个关键配置,并指出「不丢必然伴随可能重复」。