rabbitmq、rocketmq、kafka都有可能出现重复消费的问题
其实重复消费不可怕,可怕的是你没考虑到重复消费之后,怎么保证幂等性。假设你有个系统,消费一条往数据库里插入一条,要是你一个消息重复两次,不就插入了两条,这数据就错了。但是你要是消费到第二次的时候,自己判断一下已经消费过了,直接扔了,不就只保留了一条数据。
幂等性,通俗点说,就一个数据,或一个请求,给你重复来多次,你得确保对应的数据不会改变,不能出错。
怎么保证消息队列消费的幂等性
1. 生产者发送每条数据的时候,里面添加一个全局唯一的id, 消费者消费到消息后, 先根据消息id去redis中查询,如果redis不存在,就处理消息,然后将消息id写入redis。如果redis中存在,说明消息已经消费过,就不用处理。
2. 基于数据库的唯一键,保证重复数据不会重复插入。因为有唯一键约束,所以重复数据只会插入报错,不会导致数据库中出现脏数据。



