首页 > 其他分享 >MQ——如何处理消费过程中的重复消费

MQ——如何处理消费过程中的重复消费

时间:2023-01-11 22:44:10浏览次数:39  
标签:消费 重复 least 队列 MQ 消息 once

 

1、关于消息重复

消息重复的情况必然存在在 MQTT 协议中,给出了三种传递消息时能够提供的服务质量标准,这三种服务质量从低到高依次是:

  • At most once: 至多一次。消息在传递时,最多会被送达一次。换一个说法就是,没什么消息可靠性保证,允许丢消息。一般都是一些对消息可靠性要求不太高的监控场景使用,比如每分钟上报一次机房温度数据,可以接受数据少量丢失。
  • At least once: 至少一次。消息在传递时,至少会被送达一次。也就是说,不允许丢消息,但是允许有少量重复消息出现。
  • Exactly once:恰好一次。消息在传递时,只会被送达一次,不允许丢失也不允许重复,这个是最高的等级。

这个服务质量标准不仅适用于 MQTT,对所有的消息队列都是适用的。我们现在常用的绝大部分消息队列提供的服务质量都是 At least once,包括 RocketMQ、RabbitMQ 和 Kafka 都是这样。也就是说,消息队列很难保证消息不重复。

 

2、解决方法

从业务逻辑设计上入手,将消费的业务逻辑设计成具备幂等性的操作。

从对系统的影响结果来说:At least once + 幂等消费 = Exactly once。

比如根据订单的状态,只有未付款的才能继续付款,已付款的和已关闭的不能付款。

 

3、为什么大部分消息队列都选择只提供 At least once 的服务质量,而不是级别更高的 Exactly once 呢?

解决一个问题,往往会引发别的问题。若消息队列实现了exactly once,会引发的问题有:①消费端在pull消息时,需要检测此消息是否被消费,这个检测机制无疑会拉低消息消费的速度。可以预想到,随着消息的剧增,消费性能势必会急剧下降,导致消息积压;②检查机制还需要业务端去配合实现,若一条消息长时间未返回ack,消息队列需要去回调看下消费结果(这个类似于事物消息的回查机制)。这样就会增加业务端的压力,与很多的未知因素。 所以,消息队列不实现exactly once,而是at least once + 幂等性,这个幂等性让给我们去处理。

标签:消费,重复,least,队列,MQ,消息,once
From: https://www.cnblogs.com/shog808/p/17045117.html

相关文章

  • 代码随想录day01|26.删除重复项;27.移除元素;704.二分;844.含退格字符串
    2627;704;844关键内容:数组;二分;快慢指针首先,在面对数组时,我们必须清楚,数组中的元素在内存中是连续分布的,单独删除一个元素是不可实现的,所以当出现类似删除原数组元素之......
  • MQTT+RocketMq+ICE规则引擎+BladeX实现车辆预警功能
     1.MQTT与车辆终端通讯接收V2X数据。2.消费emqx,监听同时将数据发送到rocketMQ的生产者。3.MQ消费者监听V2X的topic,且要保证消费顺序。4.feigin调用报警服务中的规则......
  • RocketMQ基础详解
    RocketMQRocketMQ作为一款纯java、分布式、队列模型的开源消息中间件,支持事务消息、顺序消息、批量消息、定时消息、消息回溯等。主要功能是异步解耦和流量削峰。常见的......
  • RocketMQ安装时问题
    Windows环境下RocketMQ安装时问题步骤去官网下载运行版本zip去git上下载管理端安装问题RocketMQ的目录和jdk的目录都不能有空格否则提示找不到主类无奈我的jdk......
  • RabbitMQ学习笔记05:Routing
    参考资料:RabbitMQtutorial-Routing—RabbitMQ  前言在之前的文章中我们构建了一个简单的日志系统,它可以广播消息到多个消费者中。在这篇文章中,我们打算实现仅订......
  • 关于华普物联HP-ERS-T200串口服务器MQTT 对接百度云操作案例
    HP-ERS-T200支持MQTT功能,支持EMQ、百度云、阿里云和腾讯云等平台对接。本文件以百度云对接做演示。 硬件连接 HP-ERS-T200通过USB转RS232串口线连接到PC......
  • 避免 MySQL 插入重复数据的 4 种方式
    最常见的方式就是为字段设置主键或唯一索引,当插入重复数据时,抛出错误,程序终止,但这会给后续处理带来麻烦,因此需要对插入语句做特殊处理,尽量避开或忽略异常,下面我简单介绍一......
  • 编译打包rabbitmq然后一键部署的简单方法
    摘要之前总结过一版,但是感觉不太全面想着本次能够将使用中遇到的问题总结一下.所以本次是第二版介质下载rabbitmq不区分介质的打包文件rabbitmq-server-generic-......
  • Oracle分页查询出现重复数据的解决方法
    在使用MybatisPlus分页功能时发现:前端查询第一页是没问题的,但是向后查询的时候数据始终是第一页的查询第一页的时候发现没有任何问题往后查询,比如查询第二页时数据......
  • Java代码kafka通过Kerberos认证消费数据
    引入依赖<dependency><groupId>org.springframework.kafka</groupId><artifactId>spring-kafka</artifactId></dependency>kafka生产importjava.io.PrintStrea......