> RabbitMQ 幂等性核心在于全局唯一 ID 配合业务去重。常用方案包括:利用数据库唯一索引拦截、使用 Redis 原子性(SETNX)记录消费状态,或通过乐观锁/状态机确保重复操作不改变数据结果。 --- 为什么需要幂等性? 在消息队列(MQ)环境中,消息重复是不可避免的。主要原因有两个: 1. 生产者重试:生产者发送消息给 MQ,MQ 收到但在返回 ACK 时网络中断,生产者误以为失败而重发。 2. 消费者重试:消费者处理完业务但在向 MQ 发送 ACK 时失败,MQ 认为消息未消费,重新投递给消费者。 因此,幂等性的目标是:无论消息被消费多少次,最终的业务结果必须与消费一次的结果一致。 --- 解决方案详解 实现幂等性的前提是:每条消息必须携带一个全局唯一的 ID(Message ID/Business ID)。 1. 利用数据库唯一索引(强一致性,适用于新增) 这是最简单且最严谨的方案。利用数据库的主键或唯一约束(Unique Key)特性。 原理:将消息的唯一 ID(如订单号)作为数据库表的唯一键。 流程: 1. 消费者收到消息。 2. 尝试向数据库插入数据。 3...