ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2020-01-29 23:54:20  阅读:265  来源: 互联网

标签:队列 版本号 重复 消息 查询 id once


一、消息重复现象

  在 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有没有消费过,没有则进行处理。

标签:队列,版本号,重复,消息,查询,id,once
来源: https://www.cnblogs.com/ITyannic/p/12241861.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有