如何保证队列的消息不被重复消费,用redis是怎么搞的?

Pack 发布于 2020-02-29 17:38
阅读 279
收藏 0
分类:nosql缓存

下面的第二点,没怎么理解。有劳,有大侠能解释一下么。


【另外,还有什么别的方案么。 总觉按照参考的这几点得这么搞,吞吐量会下降。】


7、如何保证队列的消息不被重复消费?

这个需要灵活作答,考察的是思考力,因为消费的场景有很多,有数据库、有缓存、有第三方接口


1.比如针对数据库,你拿到这个消息做数据库的insert操作。那就容易了,给这个消息做一个唯一主键(或者UUID),那么就算出现重复消费的情况,就会导致主键冲突,避免数据库出现脏数据。

2.再比如redis缓存,你拿到这个消息做redis的set的操作,那就容易了,不用解决,因为你无论set几次结果都是一样的,set操作本来就算幂等操作。

3.再比如第三方接口,需要确定两点,第三方接口程序是有去重能力的,那么脏一点直接丢数据过去,如果没有去重能力,还是需要我们来写程序去重,就是第2点的办法。


489
Pack
Pack

redis的数据结构是key-value的,不会出现相同的key,所以多次set操作都是操作的同一条数据。
幂等技术有:唯一索引;token机制;状态机;分布式锁等等。增加幂等验证肯定是会损耗系统性能的,但对于数据的一致性这点性能损耗是值得的。

另外我觉得这个问题是关于rabbitMQ的,这个回答纯粹是从消费者角度思考的,和使用什么消息中间件没什么关系。
如果从rabbitMQ角度回答的话应该是:

  • 使用Transaction(事务)模式或Confirm(确认)模式来确保生产者的消息发送到RabbitMQ服务器
  • 使用消息确认机制来确保消息从队列正确的投递到消费者

当然以上两点并不能完全保证消息不重复发送和消费,所以客户端的幂等验证也是需要的

请先 登录 后评论