• 消息队列如何处理重复消息


    一、消息重复现象

      在 MQTT 协议中,给出了三种传递消息时能够提供的服务质量标准:

          At most once:最多一次,这种情况会丢失部分数据,一般日志收集这种对数据不严格的可以使用

          At least once:最少一次,这种会导致一条消息重复发送

      Exactly once:正好一次,一条消息只会被消费一次

          

      RocketMQ,Rabbit MQ,Kafka都是使用的At least once,虽然消息会重复,但不会丢失。不使用Exactly once这种呢,是因为这种每次发送前发送都要检查这条消息是否已成功发送了,大大降低了MQ的性能。

         

    二、解决方案

      那消息重复了,该如何解决呢?一般都是在消费端保证幂等性来解决。

      幂等:f(f(x))=f(x),执行多次和执行一次的结果是相同的,这种我们称之为幂等的。

      比如现在有个需求:给账户A的余额增加100。

      方案一:通过唯一约束控制

        1.数据库唯一索引:

          流水表中交易订单号和账户建立唯一索引,重复insert的时候违反唯一性,所以只会成功执行一次。

        2.redis的setnx

          redis中有这个key就不能重复操作

      方案二:设置前提条件

        1.数据库查询

          加分布式锁,然后查询有没有该订单号的流水,没有则可以插入。

        2.数据库版本号

          查询出当前记录以及其中的版本号,更新的时候根据版本号来更新。      

      方案三:全局id

        生产者给数据增加一个全局id,消费端去查询这个id有没有消费过,没有则进行处理。

  • 相关阅读:
    标签最低高度设置minheight不兼容
    字体综合属性(font)写法顺序为
    让IE6、IE7、IE8支持CSS3的圆角、阴影样式
    微信小程序3D轮播图
    微信小程序左滑删除
    android ble 蓝牙4.0开发日志(四)
    Windows邮件服务器hMailServer,网页前端访问平台Webmail搭建
    邮件服务器hMailServer管理工具hMailServer Administrator汉化
    蓝牙设计
    Windows下搭建免费、开源的邮件服务器hMailServer
  • 原文地址:https://www.cnblogs.com/ITyannic/p/12241861.html
Copyright © 2020-2023  润新知