消息重复消费是各个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. java软件工程师成长过程的学习
  2. 条码扫描枪----针对MS3391扫码器的工作原理
  3. wxWidgets:wxToggleButton类用法
  4. 应用程序服务器迁移:从JBoss EE5到Wildfly EE7
  5. 11个Javascript树形菜单
  6. 【产品】产品经理常用的五大分析法
  7. 黄聪:火狐firefox打开flash就卡
  8. Mysql数据库知识总结
  9. 进字节一年了,分享一下当初刷的一百多篇算法题解
  10. 阶段1 语言基础+高级_1-3-Java语言高级_09-基础加强_第2节 反射_6_反射_获取字节码Class对象的三种方式...
  11. CAN详解--协议详解
  12. 上海科技大学信息科学与技术学院夏令营
  13. 有没有和作业帮一样的计算机,学霸君、学习宝和作业帮哪个好【对比】
  14. CentOS 7.3安装详解
  15. 计算机音乐我还是曾经那个少年,我还是曾经的那个少年什么歌曲
  16. NK-RTU980 USB bulk传输
  17. 常见的弱口令爆破工具
  18. IE加载ocx时提示控件不安全的解决方法
  19. Android通过gradle实现debug和release包名不同
  20. Linux无线网卡驱动更新

热门文章

  1. 13款国内外知名PHP集成环境的优缺点分析
  2. Seal Report 使用教程(四)设计图形报表
  3. Swagger2简单使用教程
  4. Correlate-and-Excite: Real-Time Stereo Matching viaGuided Cost Volume Excitation(CoEx)(一)论文翻译
  5. 东北大学自学考试计算机网络专业(独立本科段)
  6. 软件测试模型——V模型 W模型
  7. 少年群侠传服务器维护时间,《少年群侠传》限时闯关攻略 五大小技巧你发现了吗?...
  8. [Android]能提高下载 android SDK 的一种方法
  9. 【知识点扫盲】什么是域名以及域名解析
  10. 下载NetSarang的Xshell (完全免费)