【RocketMQ 】消息重复发送的原因

首先说下消息重复发送的原因:

  1. 消息异常重复发送
  2. 消费消息抛出异常
  3. 重平衡
  4. 清理长时间消费的消息
  5. 消费者提交offset失败
  6. 主从同步offset失败
  7. 服务端持久化offset失败

在说正面的失败原因前,我们先看下rocketmq前提的基础知识

RocketMQ发送消费消息的基本原理(按照FIFO算法)

  1. 生产者发送消息,
  2. 通过负载均衡算法,选择发送给一个Broker下面的topic队列QUEUE,
  3. 当中首先跟这个队列建立连接,随后把消息发送给此QUEUE
  4. 若消费者消费到此queue,消息就被消费啦!~

简单说明下:

  • Broker: 服务端
  • Topic:一类消息集合的名字
  • Queue:就是Topic集合中的成员(队列),存储消息的===> 咋理解呢?就是大头兵,真正干活的,存消息的

上面的基本原理是建立在正常的情况下,但是(哈哈,最怕但是了~),就是我们本文的核心了!异常情况下呢?

一、消息异常重复发送

比如消息发送超时,响应超时,中途中断等等

这个时候我们的RocketMQ为了保证消息成功发送,就会进行消息发送的重试操作,一般会重试两次

//重试次数默认两次,三次只对同步调用生效
private  int  retryTimesWhenSendFailed=2;

你可能会问?怎么进行重试操作呢?

选择另一台机器的QUEUE来发送就行啦!

这个重试操作:好处就是很好保证消息的发送成功,但是会带来的问题就是消息重复发送

eg:

mq第一次发送消息,

但是当时网速很慢,恰好过了超时时间,到达服务端,服务端接受并处理了,

但是发送端因为超时机制,又再次发送消息,这就导致了消息相同重复问题

(好家伙,有没有像计算机握手画面~哈哈)

二、消费消息抛出异常

我们在使用RocketMQ时,当我们处于并发消费消息的模式下,我们就需要:

  1. 实现接口:MessageListenerConcurrencyly(目的:处理消息)

  2. 其次:

    • 当消费者getmsg后,

    • 就会调用MessageListenerConcurrencyly的实现,

    • 传入需要消费的消息集合msgs(这玩意是核心)

上面代码,当消息出现异常的时候:

status=null,我们会看到status被设置为RECONSUME_LATER(稍后重新消费)

所以一旦抛出异常,那么消息就可以被重复消费!重复消费!!重复消费!!!(重要的说三遍!!!)

你可能会说?这不是正常的操作嘛!抛出异常,消息都没消费成功,不重复消费咋整??

嗯哼,你提问的这个是对的哈,但是(哈哈,有转折了哈!)

我们往前捋一捋,我们消费时,服务端队列我们传入的是整个集合(关键点就在这!!!)

这意味着什么意思呢?

当然使整个消息集合都重新消费(有没有反应过来??没有?我们继续往下看啊!~)

消息处理之后,不论是成功还是异常,都需要对结果进行处理,代码如下:

在这里插入图片描述

链家

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/139332.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

CSS 实现祥云纹理背景

🪴 背景 最近掘金出来一个中秋创意活动,我准备参加一下。作品方向选择用纯css做一个中秋贺卡,其中有一些中秋的元素和一些简单的动画,而贺卡背景的实现就是本文要讲的内容。 中秋贺卡成果图(生成gif有点失真&#x1f6…

前后端分离毕设项目之springboot同城上门喂遛宠物系统(内含文档+源码+教程)

博主介绍:✌全网粉丝10W,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业毕业设计项目实战6年之久,选择我们就是选择放心、选择安心毕业✌ 🍅由于篇幅限制,想要获取完整文章或者源码,或者代做&am…

uniappAndroid平台签名证书(.keystore)生成

一、安装JRE环境 https://www.oracle.com/java/technologies/downloads/#java8 记住下载默认安装地址。ps:我都默认安装地址C:\Program Files\Java\jdk-1.8 二、安装成功后配置环境变量 系统变量配置 AVA_HOME 放到环境变量去 %JAVA_HOME%\bin 三、生成签名证书…

若依cloud -【 100 ~ 】

100 分布式日志介绍 | RuoYi 分布式日志就相当于把日志存储在不同的设备上面。比如若依项目中有ruoyi-modules-file、ruoyi-modules-gen、ruoyi-modules-job、ruoyi-modules-system四个应用,每个应用都部署在单独的一台机器里边,应用对应的日志的也单独存…

OpenCascade模型解析-详细分解模型结构

OpenCascade提供了gp_trsf、BRepBuilderAPI_Transform,可以用来实现拓扑(TopoDS_Shape)的变换:平移,(点,轴,面)镜像,旋转,缩放,移位。…

原生js值之数据类型详解

js的数据类型 数据类型分类基本数据类型boolean:布尔类undefined:未定义的值null类型数值转换 NumberparseInt 转换整数 parseFloat转换浮点数 String类型特点如何转换成字符串模板字面量字符串插值模板字面量标签函数 symbol类型特性使用 BigInt类型复杂数据类型Object类属性与…

21 mysql ref 查询

前言 这里主要是 探究一下 explain $sql 中各个 type 诸如 const, ref, range, index, all 的查询的影响, 以及一个初步的效率的判断 这里会调试源码来看一下 各个类型的查询 需要 lookUp 的记录 以及 相关的差异 此系列文章建议从 mysql const 查询 开始看 测试表结构…

2023华为OD统一考试(B卷)题库清单(按算法分类),如果你时间紧迫,就按这个刷

目录 专栏导读华为OD机试算法题太多了,知识点繁杂,如何刷题更有效率呢? 一、逻辑分析二、数据结构1、线性表① 数组② 双指针 2、map与list3、优先队列4、滑动窗口5、二叉树6、并查集7、栈 三、算法1、基础算法① 贪心算法② 二分查找③ 分治…

EMMC模块电路的PCB设计建议

EMMC电路简介 EMMC (Embedded Multi Media Card)是MMC协会订立、主要针对手机或平板电脑等产品的内嵌式存储器标准规格。EMMC在封装中集成了一个控制器,提供标准接口并管理闪存。原理电路8位数据信号如图8-38所示,地址、控制信号如图8-39所示…

PCB布线之电源线干扰?|深圳比创达EMC

一客户画户外摄像头的板子,板子上电源线非常多,6层板,电源层已经被分割完了,还有2根电源线,没办法只能并行走线了,板子画完后发主管评审,主管让其在2根电源线中间走一根地线,该客户感…

画一个时钟(html+css+js)

这是一个很简约的时钟。。。。。。。 效果&#xff1a; 代码&#xff1a; <template><div class"demo-box"><div class"clock"><ul class"mark"><liv-for"(rotate, index) in rotatedAngles":key"i…

Mac 上安装yt-dlp 和下载视频的操作

安装 打开终端&#xff0c;在终端输入 cd python的路径&#xff0c;然后输入pip3 install yt-dlp&#xff0c;如下图&#xff1b; 出现 如Successfully installed yt-dlp-2023.7.6 的时候&#xff0c;说明下载成功 下载 下载命令&#xff1a; yt-dlp --list-formats https…

利用 SOAR 加快事件响应并加强网络安全

随着攻击面的扩大和攻击变得越来越复杂&#xff0c;与网络攻击者的斗争重担落在了安全运营中心 &#xff08;SOC&#xff09; 身上。SOC 可以通过利用安全编排、自动化和响应 &#xff08;SOAR&#xff09; 平台来加强组织的安全态势。这一系列兼容的以安全为中心的软件可加快事…

Linux新手教程||Linux vi/vim

所有的 Unix Like 系统都会内建 vi 文书编辑器&#xff0c;其他的文书编辑器则不一定会存在。 但是目前我们使用比较多的是 vim 编辑器。 vim 具有程序编辑的能力&#xff0c;可以主动的以字体颜色辨别语法的正确性&#xff0c;方便程序设计。 什么是 vim&#xff1f; Vim是…

错过成考报名,今年你还有这两种方式升学!

2023年广东成人高考已经报名结束啦 错过报名或没有抢到考位的同学不用伤心 你还有另外两个提升学历的机会 开放大学or小自考 今天一起来了解一下吧~ 什么是开放大学&#xff1f; 开放教育其实也就是开放大学&#xff0c;也就是我们所说的中央广播电视大学&#xff0c;现在…

【李沐深度学习笔记】矩阵计算(4)

课程地址和说明 线性代数实现p4 本系列文章是我学习李沐老师深度学习系列课程的学习笔记&#xff0c;可能会对李沐老师上课没讲到的进行补充。 本节是第四篇&#xff0c;由于CSDN限制&#xff0c;只能被迫拆分 矩阵计算 矩阵的导数运算 向量对向量求导的基本运算规则 已知…

工作【当van-tab不满足固定在顶部】

背景 需要H5实现一下滑动列表&#xff0c;顶部tab栏可以切换&#xff0c;当向下滑动列表的时候tab栏固定到顶部。果断的看了一下官方文档&#xff1a; 就是这个&#xff0c;我一看还有扩展属性&#xff0c;非常友好。向下滑动查看文档 使用sticky实现的。众所周知&#xff0…

MySQL的进阶篇1-MySQL的存储引擎简介

存储引擎 MySQL的体系结构 0、客户端连机器【java、Python、JDBC等】 1、【MySQL服务器-连接层】认证&#xff0c;授权&#xff0c;连接池 2、【MySQL服务器-服务层】 {SQL接口&#xff08;DML、DDL、存储过程、触发器&#xff09;、解析器、查询优化器、缓存} 3、【MySQL…

旋转链表-双指针思想-LeetCode61

题目要求&#xff1a;给定链表的头结点&#xff0c;旋转链表&#xff0c;将链表每个节点向右移动K个位置。 示例&#xff1a; 输入&#xff1a;head [1,2,3,4,5], k2 输出&#xff1a;[4,5,1,2,3] 双指针思想&#xff1a; 先用双指针策略找到倒数K的位置&#xff0c;也就是(…

Linux 作业

一. 题目 二.作业内容 第一题&#xff1a; 因老师要求上传安装后远程连接XShell截图&#xff0c;如下&#xff1a; 制作yum缓存&#xff1a;[rootRHEL8 ~]# yum makecache 安装gcc&#xff1a;[rootRHEL8 ~]# yum install gcc -y 制作快照&#xff1a;快照&#xff0c;初始 s…