导致消息重复消费的场景
首先消费者有消息确认机制,来通知MQ说消费者已经消费消息了。
假设现在消费者已经处理完消息,但是还没有来得及给MQ发送确认,此时网络抖动或消费者挂了,等网络恢复或消费者重启后,因为之前MQ没有收到确认,所以这个消息还在MQ中,又因为设置了重试机制,所以消费者还会重新消费消息。
解决方案:
- 给每条消息设置一个全局唯一的id,比如支付id、订单id、文章id,当消费者接收到消息时,去校验这个id是否存在,比如根据订单id去表中查询,如果不存在,则正常接收消息处理消息;如果已经存在,就说明消息已经被消费过,不需要再消费了
- 幂等方案:【分布式锁、数据库锁(悲观锁、乐观锁)】,加锁后性能会受影响