这个问题也可以换一种问法,如何保证消息消费时的幂等性?
重复消费不可怕,可怕的是没考虑到重复消费之后怎么保证幂等性,一条数据重复出现两次,数据库里只有一条数据,这就保证了幂等性。需要结合业务来思考:
- 假如拿一个数据要写库,现根据主键查一下,如果有这个数据,那就不插入,update就可以;
2. 如果是写redis,那没问题,每次都是set,天然幂等性;
3. 如果是其他场景,那做的稍微复杂一点,需要让生产者发送每条数据时,里面加一个全局唯一id,然后这边消费带了之后,先根据这个id去redis中查一下,之前是否消费过,如果没消费过,就继续处理然后写入redis,如果消费过了,那就不处理了,保证不重复处理相同的消息即可;
4. 基于数据库的唯一键来保证重复数据不会重复插入多条,拿到数据时,每次重启可能会有重复,因为kafka消费还没来得及提交offset,重复数据拿到了以后,我们插入时因为有唯一键的约束,所以只会插入报错,不会导致数据库中出现脏数据;
所以说MQ的幂等性,需要结合具体业务来看。
