消息队列常见面试题:应对消息重复的几种幂等设计方案

面试题 潘老师 10个月前 (06-15) 38 ℃ (0) 扫码查看

大家好!今天咱们来聊聊消息队列中应对消息重复的幂等设计方案。在消息队列的使用中,消息重复是个常见问题,而幂等设计则是解决这一问题的关键。

首先是方案一,这个方案比较简单粗暴,通过约束控制来实现。比如利用数据库的 unique 索引,像在消费送积分的场景中,可以用交易的订单号来建立索引。要是重复插入积分奖励,就会违反索引规则,所以只能成功执行一条。同理,还可以利用 redis 的 setnx 来做约束,记录好消息的标识,如果 redis 中存在对应的标识,就直接拒绝插入。这就是利用数据库或者 redis 的约束控制来达到消息的幂等。

接着是方案二,设置前置条件。在消费端处理之前,先查询一下数据库,看看对应的积分奖励有没有发放成功,如果已经发放就不再重复奖励。当然,这个查询要加一个分布式锁,防止出现并发操作,不然还是会重复处理积分奖励。也可以利用数据库版本号,给要处理的数据设置一个版本号属性,处理过后版本号加一。在更新处理状态时对比版本号,如果不一致说明已经处理过,就不再进行相应处理。

最后还有方案三,就是利用给消息设置一个全局ID,不管该订单重发了多少次订单积分奖励的消息,只要是同一个订单,那么都是同一个消费ID,消费过之后就标记一下该ID已经处理过了,其他的重复消息就直接拒绝,该方案听起来很简单,其实操作起来也很复杂,因为这会带来一些新的问题,比如说这个全局的ID是如何生成的,如果出现的并发消息该怎么去处理啊等等,咱们以后再详细分享。

今天关于消息队列幂等设计的3个方案就先介绍到这里,希望对大家有所帮助!


版权声明:本站文章,如无说明,均为本站原创,转载请注明文章来源。如有侵权,请联系博主删除。
本文链接:https://www.panziye.com/ms/13039.html
喜欢 (1)
请潘老师喝杯Coffee吧!】
分享 (0)
用户头像
发表我的评论
取消评论
表情 贴图 签到 代码

Hi,您需要填写昵称和邮箱!

  • 昵称【必填】
  • 邮箱【必填】
  • 网址【可选】