如何保证RabitMQ消息不被重复消费(如何保证消息消费时的幂等性)

上篇博客主要讲了消息可靠性传递,那么是不是大家也想了解怎么保证消息队列消费的幂等性?

如何保证RabitMQ消息不被重复消费(如何保证消息消费时的幂等性)

如何保证MQ的消费是幂等性的,需要结合具体的业务来看  :

  比如你拿个数据要写库,你先根据主键查一下,如果这数据都有了(最好带有时间戳字段,每次更新都以时间戳为条件),你就别插入了,update一下好吧 

  比如你是写redis,那没问题了,反正每次都是set,天然幂等性  

  比如你不是上面两个场景,那做的稍微复杂一点,你需要让生产者发送每条数据的时候,里面加一个全局唯一的id,类似订单id之类的东西,然后你这里消费到了之后,先根据这个id去比如redis里查一下,之前消费过吗?如果没有消费过,你就处理,然后这个id写redis。如果消费过了,那你就别处理了,保证别重复处理相同的消息即可。  

  还有比如基于数据库的唯一键来保证重复数据不会重复插入多条,拿到数据的时候,每次重启可能会有重复,因为kafka消费者还没来得及提交offset,重复数据拿到了以后我们插入的时候,因为有唯一键约束了,所以重复数据只会插入报错,不会导致数据库中出现脏数据