关于mq的几件小事如何保证消息不重复消费

jack1995 jack1995     2022-12-12     689

关键词:

1.幂等性

幂等(idempotent、idempotence)是一个数学与计算机学概念,常见于抽象代数中。
在编程中一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。幂等函数,或幂等方法,是指可以使用相同参数重复执行,并能获得相同结果的函数。这些函数不会影响系统状态,也不用担心重复执行会对系统造成改变。例如,“setTrue()”函数就是一个幂等函数,无论多次执行,其结果都是一样的.更复杂的操作幂等保证是利用唯一交易号(流水号)实现.

简单来说,幂等性就是一个数据或者一个请求,给你重复来了多次,你得确保对应的数据是不会改变的,不能出错。

2.出现重复消费场景

(1)首先,比如rabbitmq、rocketmq、kafka,都有可能会出现消息重复消费的问题。因为这个问题通常不是由mq来保证的,而是消费方自己来保证的。
(2)举例kafka来说明重复消费问题
kafka有一个叫做offset的概念,就是每个消息写进去,都有一个offset代表他的序号,然后consumer消费了数据之后,每隔一段时间,会把自己消费过的消息的offset提交一下,代表我已经消费过了,下次就算重启,kafka就会让消费者从上次消费到的offset来继续消费。

但是万事总有例外,如果consumer消费了数据,还没来得及发送自己已经消费的消息的offset就挂了,那么重启之后就会收到重复的数据。
技术图片

3.保证幂等性(重复消费)

要保证消息的幂等性,这个要结合业务的类型来进行处理。下面提供几个思路供参考:
(1)、可在内存中维护一个set,只要从消息队列里面获取到一个消息,先查询这个消息在不在set里面,如果在表示已消费过,直接丢弃;如果不在,则在消费后将其加入set当中。
(2)、如何要写数据库,可以拿唯一键先去数据库查询一下,如果不存在在写,如果存在直接更新或者丢弃消息。
(3)、如果是写redis那没有问题,每次都是set,天然的幂等性。
(4)、让生产者发送消息时,每条消息加一个全局的唯一id,然后消费时,将该id保存到redis里面。消费时先去redis里面查一下有么有,没有再消费。
(5)、数据库操作可以设置唯一键,防止重复数据的插入,这样插入只会报错而不会插入重复数据。

上一篇《如何保证消息队列的高可用

下一篇《如何防止数据队列数据丢失

关于mq的几件小事如何保证消息队列的高可用

1.RabbitMQ的高可用RabbitMQ基于主从模式实现高可用。RabbitMQ有三种模式:单机模式,普通集群模式,镜像集群模式。(1)单机模式:单机模式就是demo级别的,生产中不会有人使用。(2)普通集群模式普通集群模式就是在多台机器... 查看详情

关于mq的几件小事消息积压在消息队列里怎么办

1.大量消息在mq里积压了几个小时了还没解决场景:几千万条数据在MQ里积压了七八个小时,从下午4点多,积压到了晚上很晚,10点多,11点多。线上故障了,这个时候要不然就是修复consumer的问题,让他恢复消费速度,然后傻傻... 查看详情

关于mq的几件小事消息队列的用途优缺点技术选型

1.为什么使用消息队列?(1)解耦:可以在多个系统之间进行解耦,将原本通过网络之间的调用的方式改为使用MQ进行消息的异步通讯,只要该操作不是需要同步的,就可以改为使用MQ进行不同系统之间的联系,这样项目之间不... 查看详情

关于mq的几件小事如果让你设计一个mq,你怎么设计

其实回答这类问题,说白了,起码不求你看过那技术的源码,起码你大概知道那个技术的基本原理,核心组成部分,基本架构构成,然后参照一些开源的技术把一个系统设计出来的思路说一下就好比如说这个消息队列系统,我们... 查看详情

3、rabbitmq如何保证消息不被重复消费

参考技术A我们使用MQ的时候肯定是消息是准确的,既不能多也不能少。那我们来看看什么情况下可能会出现重复消费的情况。一般来说消费者消费完消息后,会ack到MQ然后MQ会删除这条消息。但假设由于网络原因这条ACK丢失了,... 查看详情

rabbitmq消息重复消费场景及解决方案

...及时了解这里介绍一下RabbitMQ重复消费的场景,以及如何解决消息重复消费的问题。注:本文只做粗略逻辑实现借鉴,实际业务场景需根据实际情况再做细化处理。目录消息重复消费MQ的一条消息被消费者消费了多次... 查看详情

关于redis的几件小事redis的并发竞争问题

1.什么是并发竞争就是多客户端同时并发写一个key,可能本来应该先到的数据后到了,导致数据版本错了。或者是多客户端同时获取一个key,修改值之后再写回去,只要顺序错了,数据就错了。2.怎么解决采用分布式锁+数据修改... 查看详情

一条消息怎么被两个消费者消费

...息。这时候消费者就接收到了两条一样的消息参考技术A如何保证消息不被重复消费,或者说如何保证消息幂等性。rbbitmq,rocketmq,kafka,都有可能出现消息重复消费的情况,以kafka来说kafka实际上有个offset的概念,就是每个消息写进... 查看详情

关于redis的几件小事redis的持久化

1.redis持久化的意义redis持久化的意义,在于故障恢复。如果没有对数据进行持久化,那么如果redis遇到灾难性的故障,就会丢失所有的数据。如果通过redis的持久化机制将数据持久化到硬盘上面去,然后在定期将磁盘上的文件备... 查看详情

mq消息队列(代码片段)

...点1.3消息队列的缺点1.4消息队列比对2、RabbitMQ2.1、RabbitMQ如何保证消息不被重复消费2.2、RabbitMQ如何保证消息不丢失2.2.1生产者丢数据2.2.2消息队列丢数据2.2.3消费者丢数据2.3、RabbitMQ如何保证消息有序2.4、RabbitMQ如何处理消息堆积... 查看详情

mq-面试题

...并发度较低,消费端出现异常会阻塞消费。理论程序应该保证消息的顺序,而不是靠消息中间件保证顺序。消息重复问题:网络不可达会造成消息重复,比如发生的时候网络超时,生产者重新发了一次。消息重复无可避免,需要... 查看详情

关于springmvc的几件小事(代码片段)

一.SpringMVC表单标签He处理静态资源1.Spring的表单标签通过SpringMVC的表单标签可以实现将模型数据中的属性和HTML表单元素相绑定,以实现表单数据更便捷编辑和表单值的回显。1.form标签一般情况下,通过GET请求获取表单页面,而通... 查看详情

消息队列的面试题3

1、面试题 如何保证消息不被重复消费啊(如何保证消息消费时的幂等性)? 2、面试官心里分析 其实这个很常见的一个问题,这俩问题基本可以连起来问。既然是消费消息,那肯定要考虑考虑会不会重复消费?能不... 查看详情

mq相关问题

...MQ优缺点优点缺点各种MQ的适用场景activemqrabbitmqrocketmqkafka如何保证MQ高可用?rabbitmq高可用kafka高可用如何保证消息不被重复消费发送的消息丢失rabbitmq的消息丢失kafka的消息丢失如何保证消息的顺序性?MQ相关问题为什么使用MQ解... 查看详情

如何保证消息不被重复消费啊(如何保证消息消费时的幂等性)?

 重复消费可能会在什么场景下出现(以kafka为例)   kafka实际上有个offset的概念,就是每个消息写进去,都有一个offset,代表他的序号,  然后consumer消费了数据之后,每隔一段时间,会把自己消费过的消息的offset提... 查看详情

关于spring中aop的几件小事(代码片段)

0.AOP简介AOP(Aspect-OrientedProgramming,面向切面编程):是一种新的方法论,是穿透OOP的补充。AOP的主要编程对象是切面(aspect),而切面模块化横切关注点。在使用AOP编程时,仍然需要定义功能功能,但可以明确的定义这个功能在哪里,... 查看详情

mq中如何保证消费者顺序消费

...。但是有的时候消息按照顺序处理是很重要的,那我们该如何来保证消息的顺序呢,下面将从activemq和rocketmq来看看,它们是如何来保证消息的顺序问题的?我们还可以有别的处理方案么?1、利用Activemq的高级特性:consumer之独有... 查看详情

浅谈rocketmq如何保证消息不丢失(代码片段)

RocketMQ如何保证消息不丢失?一、明确丢失消息场景二、RocketMQ避免消息丢失解决方案1、消息生产者使用事务消息2、配置同步刷盘+Dledger主从架构3、消息消费者端使用同步消费机制4、设计降级方案MQ如何避免消息不丢失&#x... 查看详情