记录面试题二:如何保证消息不被重复消费(幂等性)?

150 阅读1分钟

问:如何保证消息不被重复消费?或者说,如何保证消息消费时的幂等性?

出现重复消费的原因:

正常情况下,消费者在消费消息的时候,消费完毕后,会送一个确认消息给消息队列,消息队列接收到消息后就知道被消费了,就会将该消息从消息队列中删除;但是因为网络传输等问题,确认消息并没有传输到消息队列中,导致队列不知道该消息有没有被消费,会在将该消息发送给其他的消费者进行消费;

解决思路:

  • 保证消息的唯一性:就算是多次传输,不要让消息的多次消费带来影响
  • 保证消息的幂等性

具体解决方案:

比如,再写消息队列的时候,给数据添加唯一标识,消费者消费消息的时候,根据唯一标识判断该消息是否被消费过; 假如有个系统,消费一条消息就往数据库中插入一条数据,要是你一个消息重复了两次,就会插入两条数据。所以在我们消费到第二条数据的时候,自己判断以下该消息是否已经被消费过了?如果已经消费过了,就直接删除该消息,就不会造成重复数据和重复消息了,从而保证了消息数据的正确性!