性能文章>MQ消费端如何保证幂等性?>

MQ消费端如何保证幂等性?原创

249643

承接上文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实现的去重。

 

点赞收藏
平凡人笔记

公众号:平凡人笔记

请先登录,查看4条精彩评论吧
快去登录吧,你将获得
  • 浏览更多精彩评论
  • 和开发者讨论交流,共同进步

为你推荐

一文讲透消息队列RocketMQ实现消费幂等

一文讲透消息队列RocketMQ实现消费幂等

一次 Rancher go 应用内存占用过高问题排查

一次 Rancher go 应用内存占用过高问题排查

3
4