消息重复消费是各个MQ都会发生的常见问题之一,在一些比较敏感的场景下,重复消费会造成比较严重的后果,比如重复扣款等。

那么在什么情况下会发生RocketMQ的消息重复消费呢?

  1. 当系统的调用链路比较长的时候,比如系统A调用系统B,系统B再把消息发送到RocketMQ中,在系统A调用系统B的时候,如果系统B处理成功,但是迟迟没有将调用成功的结果返回给系统A的时候,系统A就会尝试重新发起请求给系统B,造成系统B重复处理,发起多条消息给RocketMQ造成重复消费
  2. 在系统B发送消息给RocketMQ的时候,也有可能会发生和上面一样的问题,消息发送超时,结果系统B重试,导致RocketMQ接收到了重复的消息
  3. 当RocketMQ成功接收到消息,并将消息交给消费者处理,如果消费者消费完成后还没来得及提交offset给RocketMQ,自己宕机或者重启了,那么RocketMQ没有接收到offset,就会认为消费失败了,会重发消息给消费者再次消费

    消息重复消费的场景大概可以分为生产者端重复消费和消费者端重复消费,那么如何来解决消息的重复消费呢?

答案是通过幂等性来保证,只要保证重复消费的消息不对结果产生影响,就完美地解决这个问题

在生产者端要保证幂等性的话,大概可以使用以下两种方式:
① RocketMQ支持消息查询的功能,只要去RocketMQ查询一下是否已经发送过该条消息就可以了,不存在则发送,存在则不发送
② 引入redis,在发送消息到RocketMQ成功之后,向redis中插入一条数据,如果发生重试,则先去redis中查询一下该条消息是否已经发送过了,存在的话就不重复发送消息了

生产者的这两种幂等性方案都可以实现,但是都存在一定的缺陷
方案①,RocketMQ消息查询的性能不是特别好,如果是在高并发的场景下,每条消息在发送到RocketMQ时都去查询一下,可能会影响接口的性能
方案②,在一些极端的场景下,redis也无法保证消息发送成功之后,就一定能写入redis成功,比如写入消息成功而redis此时宕机,那么再次查询redis判断消息是否已经发送过,是无法得到正确结果的

既然在生产者做幂等性的方案都不是特别靠谱,那就再在消费者端来做吧

消息的消费,最后都对应的是数据库的操作,只要在消息消费的时候,判断一下数据库中是否已经消费过了这条消息,就可以保证幂等性了,例如使用唯一索引,保证一条消息只被消费一次。

消息重复消费是一个非常常见的问题,在很多系统调用频繁的场景下,都可能会出现超时重试的情况,还有就是系统频繁迭代,经常重启系统更新的场景,也会出现消息重复消费

生产者端发送重复的消息到RocketMQ中其实问题不大,消息只是在RocketMQ中重复了,并没有影响到系统的数据,我们只需要在最后修改数据库的时候,保证好幂等性即可

RocketMQ消息重复消费场景及解决办法相关推荐

  1. kafka 脚本发送_Kafka笔记归纳(第五部分:一致性保证,消息重复消费场景及解决方式)...

    写在开头: 本章是Kafka学习归纳第五部分,着重于强调Kafka的事一致性保证,消息重复消费场景及解决方式,记录偏移量的主题,延时队列的知识点. 文章内容输出来源:拉勾教育大数据高薪训练营. 一致性 ...

  2. RocketMQ消息乱序场景及解决方法

    消息乱序也是RocketMQ中的一个常见问题,那么到底为什么会出现消息乱序呢? 首先我们知道在RocketMQ的Topic中,会有多个MessageQueue作为数据分片,每个MessageQueue ...

  3. 面试官:给我一个避免消息重复消费的解决方案?

    欢迎关注方志朋的博客,回复"666"获面试宝典 消息中间件是分布式系统常用的组件,无论是异步化.解耦.削峰等都有广泛的应用价值. 我们通常会认为,消息中间件是一个可靠的组件--这里 ...

  4. RocketMQ常见问题-消息重复消费和消息重复的问题

    RocketMQ不解决消息重复问题,RocketMQ不解决消息重复问题,RocketMQ不解决消息重复问题,重要的事情说三遍. 基本上说我很讨厌有人问这个问题,问这个问题首先你对消息的生命周期缺乏理解 ...

  5. Spring Cloud Stream如何处理消息重复消费

    最近收到好几个类似的问题:使用Spring Cloud Stream操作RabbitMQ或Kafka的时候,出现消息重复消费的问题.通过沟通与排查下来主要还是用户对消费组的认识不够.其实,在之前的博文 ...

  6. 【重难点】【RabbitMQ 02】如何避免消息重复投递和消息重复消费、如何防止消息丢失、如何保证消息的顺序性、如何保证消息队列的可用性

    [重难点][RabbitMQ 02]如何避免消息重复投递和消息重复消费.如何防止消息丢失.如何保证消息的顺序性.如何保证消息队列的可用性 文章目录 [重难点][RabbitMQ 02]如何避免消息重复 ...

  7. kafka 重复消费场景及解决方案

    1.与消费者有关的重要参数 在讨论重复消费之前,首先介绍一下kafka中几个跟消费有关的配置参数. enable.auto.commit 默认值true,表示消费者会周期性自动提交消费的offset ...

  8. 聊聊 Kafka:Kafka 消息重复的场景以及最佳实践

    一.前言 上一篇我们讲了 聊聊 Kafka:Kafka 消息丢失的场景以及最佳实践,这一篇我们来说一说 Kafka 消息重复的场景以及最佳实践. 我们下面会从以下两个方面来说一下 Kafka 消息重复 ...

  9. RabbitMQ消息重复消费问题

    业务背景 消息队列在数据传输的过程中,为了保证消息传递的可靠性,一般会对消息采用ack确认机制,如果消息传递失败,消息队列会进行重试,此时便可能存在消息重复消费的问题. 比如,用户到银行取钱后会收到扣 ...

最新文章

  1. C语言 之 PTA乙级错误集锦
  2. linux 如何禁用账号和解除禁用账号
  3. linux查进程ps和top,Linux中几个进程查看命令总结 ps, top, htop, vmstat
  4. Codeforces Round #309 (Div. 2) C
  5. 将Facebook整个托管在AWS上,这可行吗?
  6. merge into语句的使用
  7. OpenCV安装好了,show第一个例子,找找成就感~~~
  8. Map与Set的经典OJ题
  9. php 过滤特殊字符和sql防注入代码以及xss攻击等
  10. activeMQ的三种通讯模式
  11. 爬虫之拉勾网职位获取
  12. Android实现按两次back键退出应用
  13. HDU 5228 ZCC loves straight flush( BestCoder Round #41)
  14. PX4从放弃到精通(十八):参数
  15. nginx整合fastdfs出现2个master进程没有worker进程的原因以及解决方法
  16. 老男孩linux培训靠谱吗?到底该不该去?
  17. 天津web前端培训,BAT会去哪里招好前端?
  18. HashMap1.7中的线程安全问题
  19. 英语记忆软件测试大乐,6款优质育儿APP测评推荐:听故事、学外语,寓教于乐,带娃不再累!...
  20. Java 生成随机汉字名称

热门文章

  1. 威纶通学习有感(1)创建工程
  2. 感光电路板的使用方法和制作步骤
  3. 最快。最准确的微信域名检测
  4. 云之彼端,牵手未来—— “我思故我在”—我眼中的第四届中国云计算大会
  5. 在html5中drawimage,HTML5中drawImage用法分析
  6. 宏替换 #define SQR(X) X*X
  7. 硕士研究生入学考试报考指南(考研流程)
  8. springboot_查询es的时候出现问题
  9. Dubbo快速入门 —— 基于SpringBoot Starter 开发微服务应用案例 + 知识讲解
  10. NetSarang软件中nssock2.dll模块被植入恶意代码技术分析与防护方案