星海

分布式与消息队列 · 单选题 · 第 60 题

Java 后端开发面试 · 第 60 题

消息队列在至少一次投递的语义下,可能把同一条消息投递多次。消费端应当怎么做?

  1. A只要 MQ 配置了精确一次投递,消费端就不需要处理重复
  2. B用业务唯一键(如订单号)去重,或者把消费逻辑设计成幂等
  3. C关闭消费失败后的重试机制,这样消息就不会被重复投递
  4. D增加主题的分区数量,让重复的消息分散到不同的消费者

答案

B B. 用业务唯一键(如订单号)去重,或者把消费逻辑设计成幂等

解析

网络抖动、消费者重启、再均衡都可能导致重复投递,所以消费端必须保证幂等。常见做法是唯一索引或去重表,状态机条件更新(如 UPDATE … WHERE status = '待支付'),或用 Redis SETNX 记录已处理的消息 ID。即使 MQ 宣称支持精确一次,一般也只限于它自身的范围,写入外部数据库时仍要自己做幂等。

在线刷这套题:即时判分、错题本、闪卡复习,不用登录就能练。