【RocketMQ中生产者生产消息的高可用机制、消费者消费消息的高可用机制、消息的重试机制、死信队列于死信消息】

news2025/2/27 21:04:58

一.知识回顾

【0.RocketMQ专栏的内容在这里哟,帮你整理好了,更多内容持续更新中】
【1.Docker安装部署RocketMQ消息中间件详细教程】
【2.RocketMQ生产者发送消息的三种方式:发送同步消息、异步消息、单向消息&案例实战&详细学习流程】
【3.RocketMQ消费者进行消费消息的二种方式:集群消费、广播消费&案例实战&详细学习流程&集群消费模、广播模式的适用场景&注意事项】
【4.RocketMQ中的顺序消息、生产者顺序生产消息、消费者顺序消费消息、顺序包括全局有序和分块有序、代码样例实战】
【5.RocketMQ中延时消息的生产与消费、批量消息的生产与消费、消息的过滤、消息的Tag过滤和SQL过滤、SQL过滤解决SQL92问题,代码样例实战】
【6.RocketMQ分布式事务消息、RocketMQ分布式事务的发展流程、RocketMQ分布式事务二阶段提交解决方案、分布式案例实操学习、RocketMQ分布式事务使用场景以及注意事项】
【7.一文带你详细学习RocketMQ存储设计方案、RocketMQ中消息文件存储结构、过期文件删除机制、零拷贝与MMAP内存映射】
【8.RocketMQ的高可用原理机制、RocketMQ的集群部署方式、数据刷盘机制中的同步刷盘和异步刷盘、主从同步机制和主从异步机制、broker文件中的相关配置信息以及代表的含义】

二.RocketMQ中生产者生产消息的高可用机制

2.1 消息生产的高可用机制

在这里插入图片描述

  1. 在创建Topic的时候,把Topic的多个Message Queue创建在多个Broker组上,当一个Broker组的Master不可用后,其他组的Master仍然可用,Producer仍然可以发送消息。
  2. RocketMQ目前不支持把Slave自动转成Master,如果机器资源不足, 需要把Slave转成Master,则要手动停止Slave角色的Broker,更改配置文件,用新的配置文件启动Broker。

2.2 高可用消息的生产流程

在这里插入图片描述

  1. TopicA创建在双主中,BrokerA和BrokerB中,每一个Broker中有4个队列
  2. 选择队列默认是使用轮训的方式,比如发送一条消息A时,选择BrokerA中的四个队列中的其中一个
  3. 如果发送成功,消息A发结束。
  4. 如果消息发送失败,默认会采用重试机制
retryTimesWhenSendFailed	同步模式下内部尝试发送消息的最大次数  默认值是2
retryTimesWhenSendAsyncFailed	异步模式下内部尝试发送消息的最大次数 默认值是2
  1. 如果发生了消息发送失败,这里有一个规避策略(默认配置):
  • (1) 默认不启用Broker故障延迟机制(规避策略):如果是BrokerA宕机,上一次路由选择的是BrokerA中的Q4,那么再次重发的队列选择是BrokerA中的Q1。但是这里的问题就是消息发送很大可能再次失败,引发再次重复失败,带来不必要的性能损耗。

  • (2) 注意,这里的规避仅仅只针对消息重试,例如在一次消息发送过程中如果遇到消息发送失败,规避 broekr-a,但是在下一次消息发送时,即再次调用 DefaultMQProducer 的 send 方法发送消息时,还是会选择 broker-a 的消息进行发送,只有继续发送失败后,重试时再次规避 broker-a。

    为什么会默认这么设计?
    1、某一时间段,从NameServer中读到的路由中包含了不可用的主机
    2、不正常的路由信息也是只是一个短暂的时间而已。
    生产者每隔30s更新一次路由信息,而NameServer认为broker不可用需要经过120s。
    在这里插入图片描述

  • (3). 启用Broker故障延迟机制:代码如下

    producer.setNameSrvAddr("localhost:9876");
    producer.start();
    //启动Broker故障延迟机制
    producer.setSendLatencyFaultEnable(true);
    
    1. 开启延迟规避机制,一旦消息发送失败(不是重试的)会将 Broker-a “悲观”地认为在接下来的一段时间内该 Broker 不可用,在未来某一段时间内所有的客户端不会向该 Broker 发送消息。这个延迟时间就是通过 notAvailableDuration、latencyMax 共同计算的,就首先先计算本次消息发送失败所耗的时延,然后对应 latencyMax 中哪个区间,即计算在 latencyMax 的下标,然后返回 notAvailableDuration 同一个下标对应的延迟值。
      (涉及算法,后面我们学习的时候讲解)
    2. 在发送失败后,在接下来的固定时间(比如5分钟)内,发生错误的BrokeA中的队列将不再参加队列负载,发送时只选择BrokerB服务器上的队列。
    3. 如果所有的 Broker 都触发了故障规避,并且 Broker 只是瞬间压力大,那岂不是明明存在可用的 Broker,但经过你这样规避,反倒是没有 Broker 可用来,那岂不是更糟糕了。所以RocketMQ默认不启用Broker故障延迟机制

三.RocketMQ中消费者消费消息的高可用机制

3.1 主从的高可用原理

  1. 在Consumer的配置文件中,并不需要设置是从Master读还是从Slave 读,当Master不可用或者繁忙的时候,Consumer会被自动切换到从Slave 读。有了自动切换Consumer这种机制,当一个Master角色的机器出现故障后,Consumer仍然可以从Slave读取消息,不影响Consumer程序。这就达到了消费端的高可用性。
  2. Master不可用这个很容易理解,那什么是Master繁忙呢?
    这个繁忙其实是RocketMQ服务器的内存不够导致的。当前需要拉取的消息已经超过常驻内存的大小,表示主服务器繁忙,此时才建议从从服务器拉取。

3.2 消息的重试机制

3.2.1 消息消费的重试

  1. 消费端如果发生消息失败,没有提交成功,消息默认情况下会进入重试队列中。

  2. 注意重试队列的名字其实是跟消费群组有关,不是主题,因为一个主题可以有多个群组消费。

3.2.2 顺序消息的重试

  1. 对于顺序消息,当消费者消费消息失败后,消息队列 RocketMQ 会自动不断进行消息重试(每次间隔时间为 1 秒),这时,应用会出现消息消费被阻塞的情况。因此,在使用顺序消息时,务必保证应用能够及时监控并处理消费失败的情况,避免阻塞现象的发生。
  2. 当我们使用顺序消息时,需要注意consume消费消息失败时,不能返回reconsume—later,这样会导致乱序,应该返回suspend_current_queue_a_moment,意思是先等一会,一会儿再处理这批消息,而不是放到重试队列里。

3.2.3 无序消息的重试

  1. 对于无序消息(普通、定时、延时、事务消息),当消费者消费消息失败时,可以通过设置返回状态达到消息重试的结果。
  2. 无序消息的重试只针对集群消费方式生效;广播方式不提供失败重试特性,即消费失败后,失败消息不再重试,继续消费新的消息。

3.2.4 重试次数

第几次重试与上次重试的间隔时间第几次重试与上次重试的间隔时间
110 秒97 分钟
230 秒108 分钟
31 分钟119 分钟
42 分钟1210 分钟
53 分钟1320 分钟
64 分钟1430 分钟
75 分钟151 小时
86 分钟162 小时

注意:

  1. 如果消息重试 16 次后仍然失败,消息将不再投递。如果严格按照上述重试时间间隔计算,某条消息在一直消费失败的前提下,将会在接下来的 4 小时 46 分钟之内进行 16 次重试,超过这个时间范围消息将不再重试投递。
  2. 一条消息无论重试多少次,这些重试消息的 Message ID 不会改变。

3.2.5 重试配置

集群消费方式下,消息消费失败后期望消息重试,需要在消息监听器接口的实现中明确进行配置(三种方式任选一种):

  1. 返回 RECONSUME_LATER (推荐)
  2. 返回 Null
  3. 抛出异常

集群消费方式下,消息失败后期望消息不重试,需要捕获消费逻辑中可能抛出的异常,最终返回CONSUME_SUCCESS,此后这条消息将不会再重试。

3.2.6 自定义消息最大重试次数

消息队列 RocketMQ 允许 Consumer 启动的时候设置最大重试次数,重试时间间隔将按照如下策略:

  1. 最大重试次数小于等于 16 次,则重试时间间隔同上表描述。
  2. 最大重试次数大于 16 次,超过 16 次的重试时间间隔均为每次 2 小时。
consumer.setMaxReconsumeTimes(20);

注意:
1.消息最大重试次数的设置对相同 Group ID 下的所有 Consumer 实例有效。
2.如果只对相同 Group ID下两个 Consumer 实例中的其中一个设置MaxReconsumeTimes,那么该配置对两个 Consumer 实例均生效。
3.配置采用覆盖的方式生效,即最后启动的 Consumer 实例会覆盖之前的启动实例的配置。

3.3 死信队列

3.3.1 死信队列的概念

当一条消息初次消费失败,消息队列 RocketMQ 会自动进行消息重试;达到最大重试次数后,若消费依然失败,则表明消费者在正常情况下无法正确地消费该消息,此时,消息队列 RocketMQ 不会立刻将消息丢弃,而是将其发送到该消费者对应的特殊队列中。
在消息队列 RocketMQ 中,这种正常情况下无法被消费的消息称为死信消息(Dead-Letter Message),存储死信消息的特殊队列称为死信队列(Dead-Letter Queue)。

3.3.2 死信消息的特性

  1. 不会再被消费者正常消费。
  2. 有效期与正常消息相同,均为 3 天,3 天后会被自动删除。因此,请在死信消息产生后的 3 天内及时处理。

3.3.3 死信队列的特性

  1. 不会再被消费者正常消费。
  2. 一个死信队列对应一个 Group ID, 而不是对应单个消费者实例。
  3. 如果一个 Group ID 未产生死信消息,消息队列 RocketMQ 不会为其创建相应的死信队列。
  4. 一个死信队列包含了对应 Group ID 产生的所有死信消息,不论该消息属于哪个 Topic。

3.3.4 查看死信消息

  1. 在控制台查询出现死信队列的主题信息,在消息界面根据主题查询死信消息,可以选择重新发送消息
  2. 一条消息进入死信队列,意味着某些因素导致消费者无法正常消费该消息,因此,通常需要您对其进行特殊处理。排查可疑因素并解决问题后,可以在消息队列 RocketMQ 控制台重新发送该消息,让消费者重新消费一次。

好了,到这里【RocketMQ中生产者生产消息的高可用机制、消费者消费消息的高可用机制、消息的重试机制、死信队列于死信消息】就先学习到这里,关于RocketMQ的内容持续更新创作中。

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

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

相关文章

野火FPGA入门(5)

文章目录第17讲:触摸按键控制LED灯第18讲:流水灯第19讲:呼吸灯第20讲:状态机第21讲:无源蜂鸣器驱动实验第17讲:触摸按键控制LED灯 触摸按键可分为四大类:电阻式、电容式、红外感应式、表面声波…

调优工具常用命令

语法格式 mysqldumpslow [ OPTS... ] [ LOGS... ] //命令行格式常用到的格式组合 -s 表示按照何种方式排序c 访问次数l 锁定时间r 返回记录t 查询时间al 平均锁定时间ar 平均返回记录数at 平均查询时间 -t 返回前面多少条数据 -g 后边搭配一个正则匹配模式,大小写…

机械专业学子的芯片封装仿真“逆袭之路”

作者:萧显军 导读:近期,ANSYS公司给清华大学集成电路学院捐赠了一批业界领先的计算机辅助工程(CAE)软件及自动化(EDA)软件,为清华大学的芯片设计仿真的教学科研工作提供更强大的软件服务与技术支撑。 捐的仿真软件包括ANSYS涉及…

小白学Java

ip地址:用于唯一识别标记网络中的每一台计算机 查看方法:ipconfig ip地址的表示形式:点分十进制 xx.xx.xx.xx 每个十进制数的范围:0-255 ip地址的组成 网络地址主机地址 ipv4地址分类: (特殊:…

一、react简介

目标 理解react这个框架在前端开发中的地位理解react诞生的原因和意义(react是一个用于快速构建前端视图的javaScript库)理解什么是虚拟dom、原生js模拟出虚拟dom的表示,模拟出创建虚拟dom的方法,模拟出虚拟dom转换成真实dom的方…

什么是甘特图?什么是项目管理?

数字化与信息化早已成为现今人们工作和生活中不可缺少的一部分。尤其是随着科学技术的进步,人们对数字化的期待也越来也高。作为项目管理中常备的工具,甘特图已经成为不少业内人士中常备的“神器”了。然而依旧有人搞不清甘特图与项目管理区别究竟在哪里…

Revit中创建基于线的砌体墙及【快速砌体排砖】

​  墙可以更改内部结构和材质,但是很难画出砌块样式形成的墙体,我们可以用其他方式画出砌体排砖墙么?这里我们用基于线的常规模型做砌体排砖墙。在开始我们需要做两个族,作为砌体排砖墙的基本单位,也就是一个单独的砌体块。 一…

多亏了这份大佬整理的Java进阶笔记,让我斩获7个offer

移动互联网时代,IT 系统变得愈加复杂,对我们程序员的要求也是越来越高,技术不断更新,我们还不能停止学习,停下来了就会被打上一个‘不合格的程序员’的标签,如何成为一位「不那么差」的程序员? …

java.io.IOException: FIS_AUTH_ERROR in Android Firebase

项目里更换完google-services.json文件后,获取 firebase token 时,显示报错: E/FirebaseInstanceId: Topic sync or token retrieval failed on hard failure exceptions: FIS_AUTH_ERROR. Wont retry the operation.D/AndroidRuntime: Sh…

测试行业3年经验,从大厂裸辞后,面试阿里、字节全都一面挂,被面试官说我的水平还不如应届生

测试员可以先在大厂镀金,以后去中小厂毫无压力,基本不会被卡,事实果真如此吗?但是在我身上却是给了我很大一巴掌... 所谓大厂镀金只是不卡简历而已,如果面试答得稀烂,人家根本不会要你。况且要不是大厂出来…

精品基于ssm的足球联赛管理系统的设计与实现vue

《基于ssm的足球联赛管理系统的设计与实现》该项目含有源码、论文等资料、配套开发软件、软件安装教程、项目发布教程等 使用技术: 开发语言:Java 框架:ssm 前端技术:JavaScript、VUE.js(2.X)、css3 J…

记录一次服务器CPU负载高,利用率正常的处理方法

背景: 在一次查看服务器监控的时候偶然发现其中一台服务器的CPU负载很高,但是CPU利用率基本没有,通过top命令完全看不出来问题所在,经过一些思路的排查发现了原因并处理,现记录下来。 现象: top命令查看…

前端js手写面试题汇总(一)

实现prototype继承 所谓的原型链继承就是让新实例的原型等于父类的实例: //父方法 function SupperFunction(flag1){this.flag1 flag1; }//子方法 function SubFunction(flag2){this.flag2 flag2; }//父实例 var superInstance new SupperFunction(true);//子继…

刷了一个月leetcode算法,成功收下阿里巴巴、网易等大厂的offer

前言 有人调侃我们说: 程序员不如送外卖。送外卖是搬运食物,自己是搬运代码,都不产出新的东西……透支体力,又消耗健康,可替代性极强,30岁之后就要面临被优化的危险……想跳槽,但是更高的平台…

Linux常见的链接命令有几种?分别是什么?

链接命令是创建链接文件,链接文件分为软链接和硬链接,软链接的作用是方便文件的快速访问,而硬链接的作用是可以给重要文件创建硬链接能够防止文件数据被误删。 学习目标:能够说出软链接的创建方式和硬链接的创建方式。 教程推荐…

青岛地铁交通咨询系统

大二课程《数据结构》课程设计项目,仅供参考 C&QT 项目地址 1.(重要)后台数据处理:使用图结构存储数据,利用最短路径选择算法进行路径选择; 2.检测输入框是否为空及输入合法性,使用模糊搜索实现站点的选择引导 &…

5.1获取物理内存容量

5.1获取物理内存容量 5.1.1学习Linux获取内存的方法 在 Linux 2.6 内核中, 是用 detect_memory 函数来获取内存容量的 其函数在本质上是通过调用 BIOS 中断 0x15 实现的, 分别是BIOS 中断 0x15 的3个子功能, 子功能号要存放到寄存器EAx或Ax中, 如下: 1…

【数据结构与算法】BFS 和 DFS

🔥 本文由 程序喵正在路上 原创,CSDN首发! 💖 系列专栏:数据结构与算法 🌠 首发时间:2022年11月16日 🦋 欢迎关注🖱点赞👍收藏🌟留言&#x1f43e…

关于混合SDN网络的统一信息模型方面研究事件通知的多样性问题

关于混合SDN网络的统一信息模型方面研究事件通知的多样性问题面向混合SDN中异构设备的混合域发现协议Hybrid Domain Discovery Protocol (HDDP)HDDP的主要特点混合域发现协议(HDDP)协议介绍过程总结申明: 未经许可,禁止以任何形式转载,若要引…