分布式与消息队列 · 单选题 · 第 60 题
Java 后端开发面试 · 第 60 题
消息队列在至少一次投递的语义下,可能把同一条消息投递多次。消费端应当怎么做?
- A只要 MQ 配置了精确一次投递,消费端就不需要处理重复
- B用业务唯一键(如订单号)去重,或者把消费逻辑设计成幂等
- C关闭消费失败后的重试机制,这样消息就不会被重复投递
- D增加主题的分区数量,让重复的消息分散到不同的消费者
答案
B B. 用业务唯一键(如订单号)去重,或者把消费逻辑设计成幂等
解析
网络抖动、消费者重启、再均衡都可能导致重复投递,所以消费端必须保证幂等。常见做法是唯一索引或去重表,状态机条件更新(如 UPDATE … WHERE status = '待支付'),或用 Redis SETNX 记录已处理的消息 ID。即使 MQ 宣称支持精确一次,一般也只限于它自身的范围,写入外部数据库时仍要自己做幂等。