MQ消费端如何保证幂等性?原创
1年前
338843
承接上文RabbitMQ、RocketMQ、Kafka性能为何差距如此大?
MQ消息重复,如何保证消费端的幂等性
MVCC(多版本并发控制)方式
这是乐观锁的一种实现,每一次要对库存的数量+1,
这种方式解决消息重复没有问题,但不太好,因为消息在生产的时候,生产者要判断id是不是重复的,如果是重复的,下一次version+1,相当于浏览器点击了2次。
这种方式虽然可以解决消息幂等性问题,但要求生产者也要改动,一般情况下不推荐。
去重表
并发不是很高用mysql实现,并发高用redis实现。
在表上要构建一个唯一性的索引,电商平台有一个订单id,适合做唯一性的索引,比如在进行库存扣减的时候,每次针对goods表的操作都会涉及到一笔订单,下了单或退了单,那操作的订单id是唯一的。
如果重复insert就会报已存在该订单id,捕获异常,返回1,就表示MQ中已消费完这条消息了。
用redis setnx命令也可以实现,假设mq中有2条一摸一样的数据,第一条消息保存到redis,进行具体的业务处理,第二条消息,先查询redis中是否存在,存在返回0,此时也不需要捕获异常了。
如果是分布式系统,需要使用分布式锁,
这是采用redis分布式锁实现的去重。
这是mysql实现的去重。
点赞收藏
分类: