产生原因
当消费者消费消息出现异常或者是延迟消费,会造成RabbitMq进行重试发送消息(补偿),在重试过程中,可能会造成重复消费。
解决办法
使用一个唯一的id来判断是否已经消费过,例如订单号码等。
例如生产者订单服务新增了一条订单,通过RabbitMq发送一条包含了订单id的消息给消费者库存服务。
库存服务接收到消息后,从消息中取出订单id,接着在日志或者redis中查询该订单id是否已经消费成功过。
若消费成功过,则直接return。
若还没消费过,则进行消费逻辑,并将订单id存在日志或redis中,表示已经消费了。