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

一、消息重复现象

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

原文地址:https://www.cnblogs.com/ITyannic/p/12241861.html

时间: 2024-08-02 15:24:49

消息队列如何处理重复消息的相关文章

用STL设计消息队列、优先级消息队列、资源分配管理器

STL库老早已经成为C++的一部分,在使用C++开发项目的过程中,很多人还在犹豫要不要使用STL库,觉得STL库很难,其实不然.我工作的项目中现在大量使用STL库,STL使用调试简单,高效,可以减少很多重复的代码. 本文的主要目的是使用STL的queue 和 priority queue来阐述下项目中经常使用的消息队列以及资源分配模式.本文的例子主要如下: 消息队列 带优先级的消息队列 资源分配管理器 STL容器 我们将使用下面的容器来实现本文的例子: queue 队列容器支持添加一个元素,并且

消息队列及常见消息队列介绍

原文链接:https://cloud.tencent.com/community/article/129032 一.消息队列(MQ)概述 消息队列(Message Queue),是分布式系统中重要的组件,其通用的使用场景可以简单地描述为: 当不需要立即获得结果,但是并发量又需要进行控制的时候,差不多就是需要使用消息队列的时候. 消息队列主要解决了应用耦合.异步处理.流量削锋等问题. 当前使用较多的消息队列有RabbitMQ.RocketMQ.ActiveMQ.Kafka.ZeroMQ.MetaM

消息队列_RabbitMQ-0001.RabbitMQ消息代理/队列服务器快速安全部署?

简单介绍: 说明: RabbitMQ是最先支持AMQP标准的高级消息队列协议,是一个开源的消息代理和队列服务器,主要用于不同应用之间共享数据以及为分布式服务器进行任务编排,可有效应对大流量,高负载系统通信. 相关网址: 官方下载: http://www.rabbitmq.com/ 依赖下载: http://www.erlang.org/ 快速安装: yum -y install make gcc gcc-c++ kernel-devel m4 ncurses-devel openssl-deve

强化一下概念:程序自己不去取消息,消息不会自己跑过来运行(针对线程消息队列里的消息,也是绝大多数消息)

刚才看这段代码的时候: procedure TControl.SetBounds(ALeft, ATop, AWidth, AHeight: Integer); begin if CheckNewSize(AWidth, AHeight) and ((ALeft <> FLeft) or (ATop <> FTop) or (AWidth <> FWidth) or (AHeight <> FHeight)) then begin InvalidateCon

【MQ】消息队列及常见MQ比较

一.什么是消息队列 我们可以把消息队列比作是一个存放消息的容器,当我们需要使用消息的时候可以取出消息供自己使用.消息队列是分布式系统中重要的组件,使用消息队列主要是为了通过异步处理提高系统性能和削峰.降低系统耦合性.目前使用较多的消息队列有ActiveMQ,RabbitMQ,Kafka,RocketMQ,我们后面会一一对比这些消息队列. 另外,我们知道队列 Queue 是一种先进先出的数据结构,所以消费消息时也是按照顺序来消费的.比如生产者发送消息1,2,3...对于消费者就会按照1,2,3..

消息队列(MQ)

什么是消息队列 消息队列,即MQ,Message Queue. 消息队列是典型的:生产者.消费者模型.生产者不断向消息队列中生产消息,消费者不断的从队列中获取消息.因为消息的生产和消费都是异步的,而且只关心消息的发送和接收,没有业务逻辑的侵入,这样就实现了生产者和消费者的解耦. 结合前面所说的问题: 商品服务对商品增删改以后,无需去操作索引库或静态页面,只是发送一条消息,也不关心消息被谁接收. 搜索服务和静态页面服务接收消息,分别去处理索引库和静态页面. 如果以后有其它系统也依赖商品服务的数据,

新手也能看懂,消息队列其实很简单

消息队列其实很简单 “RabbitMQ?”“Kafka?”“RocketMQ?”...在日常学习与开发过程中,我们常常听到消息队列这个关键词.我也在我的多篇文章中提到了这个概念.可能你是熟练使用消息队列的老手,又或者你是不懂消息队列的新手,不论你了不了解消息队列,本文都将带你搞懂消息队列的一些基本理论.如果你是老手,你可能从本文学到你之前不曾注意的一些关于消息队列的重要概念,如果你是新手,相信本文将是你打开消息队列大门的一板砖. 一 什么是消息队列 我们可以把消息队列比作是一个存放消息的容器,当

消息队列

1.为什么需要消息队列?当系统中出现“生产“和“消费“的速度或稳定性等因素不一致的时候,就需要消息队列,作为抽象层,弥合双方的差异. 举个例子:业务系统触发短信发送申请,但短信发送模块速度跟不上,需要将来不及处理的消息暂存一下,缓冲压力. 再举个例子:调远程系统下订单成本较高,且因为网络等因素,不稳定,攒一批一起发送. 再举个栗子,交互模块5:00到24:00和电商系统联通,和内部ERP断开.1:00到4:00和ERP联通,和电商系统断开. 再举个例子,服务员点菜快,厨师做菜慢. 再举个例子,到

IPC: 消息队列

#################################################### 消息队列   消息队列分为: 1.posix消息队列:可以在同一主机上有亲缘关系或无亲缘关系的进程间使用. 2.system v消息队列:同上. 消息队列有随内核的持续性. ----------------------------------------------------------- posix消息队列: gcc -lrt #include <mqueue.h> #include