图解RocketMQ之消费者如何进行消息重试

news2025/1/12 9:54:53

大家好,我是苍何。

在上一篇[[图解RocketMQ之生产者如何进行消息重试]]中分析了当生产者发送消息失败的时候,RocketMQ 是如何进行重试的。

最后留了一个问题,生产端的消息是重试 hold 住了,但如果消费者出现异常,消费某一条消息失败,这时候 RocketMQ 会怎么处理呢?

这还是很普遍的场景,试想一下如果订单系统发了个消息出去,库存系统消费这条消息失败,那会出现一个什么奇葩的现象呢?

就是你明明下了单买了一包辣条,结果迟迟收不到货,一查人说你的辣条订单压根没出库。

这可了得,吃不上的上辣条先不说,劳资付出去的钱可不能打了水漂啊。

那有了 RocketMQ 的消费重试,就能解决这个问题。

所以,为了了解辣条正常出货不被卡顿,学起来吧🐶。

消费重试的基本原理

当消费者在消费消息时失败,RocketMQ 会自动进行消息重试。对于顺序消息,默认会重复 16 次,每次重试间隔时间为1秒。

而对于无序消息(如普通、定时、延时和事务消息),则可以通过设置返回状态来达到重试的目的。

那如果重复 16 次之后还无法正常消费,那怎么办呢?

RocketMQ 会把该消息直接发送到死信队列中,这名字够吓人的,我先用正式的解释下:

死信队列用于处理无法被正常消费的消息。当一条消息初次消费失败,消息队列会自动进行消息重试;达到最大重试次数后,若消费依然失败,则表明消费者在正常情况下无法正确地消费该消息,此时,消息队列不会立刻将消息丢弃,而是将其发送到该消费者对应的特殊队列中。

RocketMQ 将这种正常情况下无法被消费的消息称为死信消息(Dead-Letter Message),将存储死信消息的特殊队列称为死信队列(Dead-Letter Queue)。在 RocketMQ 中,可以通过使用 console 控制台对死信队列中的消息进行重发来使得消费者实例再次进行消费。

这就像是你的女朋友连续给你发了 16 条消息,你一条都没有回复,气急败坏的她直接将你拉入黑名单,此时你就成了死信消息。

而女朋友的黑名单就是个死信队列,要想再次恢复和你宝贝女朋友的聊天,得她在微信上操作才行。

通常引起消费重试有以下两种情况:

  • 异常重试,包括消费者返回消息失败状态标识或抛出非预期异常。
  • 超时重试,包括在 PushConsumer 中排队超时。

聪明的你肯定看出这里又抛出一个概念 PushConsumer,我最讨厌留坑而不填坑,所以介绍下什么是 PushConsumer 吧。

其实它是一种消费者类型,在 RocketMQ 中把消费者分为 PushConsumer、SimpleConsumer 和 PullConsumer。

下面一张图简单介绍一下这 3 种消费者的区别吧:

RocketMQ的3种消费者的区别

很遗憾的是,在官方文档中和 PullConsumer 的介绍还没补充完🐶

PullConsumer官方介绍待补充

不过没关系,不是我们这一章的主角儿,哈哈。

消费重试策略

RocketMQ 的消费重试策略的内部机制其实是通过控制一下 3 个大将展开的:

  • 重试过程状态机:控制消息在重试流程中的状态和变化逻辑。
  • 重试间隔:上一次消费失败或超时后,下次重新尝试消费的间隔时间。
  • 最大重试次数:消息可被重试消费的最大次数。

通常是通过控制重试次数和重试时间间隔,来修改具体的重试状态来达到重试的目的。对于重试状态,大家可看下这张图:

消息状态机-官网

RocketMQ会为每个消费组都设置一个Topic名称为“%RETRY%+consumerGroup”的重试队列(这里需要注意的是,这个 Topic 的重试队列是针对消费组,而不是针对每个 Topic 设置的,也就是一个组内的消费者都是用的该重试队列),用于暂时保存因为各种异常而导致Consumer端无法消费的消息,每个Consumer实例在启动的时候就默认订阅了该消费组的重试队列Topic。

考虑到异常恢复起来需要一些时间,会为重试队列设置多个重试级别,每个重试级别都有与之对应的重新投递延时,重试次数越多投递延时就越大(实际上就是配置的延时队列的级别level)。RocketMQ对于重试消息的处理是先保存至Topic名称为“SCHEDULE_TOPIC_XXXX”的延迟队列中,后台定时任务按照对应的时间进行Delay后重新保存至“%RETRY%+consumerGroup”的重试队列中。

最大重试次数

RocketMQ默认允许每条消息最多重试16次,可以通过客户端参数DefaultMQPushConsumer.maxReconsumeTimes设置最大重试次数,

超过最大重试次数还消费失败,消息将会被无情的丢弃到死信队列中了。

maxReconsumeTimes默认值为-1,对于并发消费和顺序消费,两者的定义不一样:

  • 并发消费:-1就等于16。即并发消费默认最大重试16次,达到最大次数,消息将会发送至死信队列,不再重试。
  • 顺序消费:-1就代表着Integer.MAX_VALUE,表示无限次本地立即重试消费。这里的重试不再会将消息发往broker重试队列,只在在本地重试。

所以,可以通过配置最大重试次数来进行重试策略的自定义配置。

重试间隔时间

当然,还可以通过控制重试间隔时间来自定义重试策略,重试间隔时间指的是,过多久重试一次。

对于顺序消息,重试间隔为固定时间,默认 3000 毫秒。

那对于用的比较多的无序消息,重试时间间隔是阶梯时间,啥意思呢,先看下图:

无序消息重试阶梯时间间隔

这样做是因为,通常故障恢复需要一定的时间,如果不间断的重试,重试又失败的情况会占用并浪费资源。

所以 RocketMQ 的消费重试机制采用时间衰减的方式,并使用自身定时消费的能力来控制重试间隔时间。

首次在 10 秒后重试消费,如果消费成功则不再重试,如果消费失败则继续重试消费。第二次在 30 秒后重试消费。

依次内推,每次消费的时间间隔都会拉长,直到超出最大重试次数,则进入死信队列不再重试。

重试消费过程中的间隔时间使用了定时消息(后面会婆媳它,你可以简单理解就是内部支持的定时发送的消息),重试的消息并非直接写入到重试队列,而是先写入定时消息队列,再通过定时消息的功能转发给重试队列。

好啦,今天的分享结束。

我是苍何,这是图解 RocketMQ 教程的第 7 篇,我们下篇见~

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

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

相关文章

leetcode53. 最大子数组和(java实现)

今天分享的题目是leetcode53题 本题的解题思路:贪心算法。 举个例子: nums [-2,1,-3,4,-1,2,1,-5,4],如果说我们的累加和是负数那么就将其舍弃,换下一个位置从新进行累加,因为如果目前我们的累加和如果是负数那么还不…

Zotero的探索之路

下载安装 Zotero | Downloads:点击链接,不仅要下载软件本身,也要下载浏览器connector,这样就方便从网页抓取论文到zotero本地了,浏览器是使用插件导入下载包即可 导入文献方法 zotero自动下载(推荐&#…

C 语言快速排序算法

升序排序 /*快速排序算法排序规则 */ int32_t CmpCb(const void* _a, const void* _b) {uint16_t* a (uint16_t*)_a;uint16_t* b (uint16_t*)_b;int32_t val 0;if (*a > *b){val 1;}else if (*a < *b){val -1;}else {val 0;}return val; }int main() {// 创建局部…

c++----类与对象(下)

当我们简单的学习了上一篇日期类。简单的理解并且使用了我们前面学习的知识。当然这还只是我们c的九牛一毛。并且我们的类与对象的知识还没学习完。今天我们来把类与对象的知识完善一下。 初始化列表 那么今天我们就不讲废话了&#xff0c;我们直接来主题。首先我们可以看到我…

大型语言模型入门

大型语言模型 快速、全面了解大型语言模型。学习李宏毅课程笔记。 ChatGPT 目前由OpenAI公司发明的非常火的人工智能AI应用ChatGPT&#xff0c;到底是什么原理呢&#xff1f; G&#xff1a;Generative(生成) P&#xff1a;Pre-trained(预训练) T&#xff1a;Transformer(一种…

手把手教你如何在Linux上轻松安装Python,告别编程入门难题

导语&#xff1a; Python作为当下最热门的编程语言之一&#xff0c;受到了越来越多人的喜爱。对于Linux用户来说&#xff0c;掌握如何在Linux上安装Python至关重要。今天&#xff0c;就让我带领大家一步步在Linux上安装Python&#xff0c;让你轻松迈入编程世界&#xff01; 一…

MATLAB(7)潮汐模型

一、前言 在MATLAB中模拟潮汐通常涉及到使用潮汐的理论模型&#xff0c;如调和常数模型&#xff08;Harmonic Constants Model&#xff09;&#xff0c;它基于多个正弦和余弦函数的叠加来近似潮汐高度随时间的变化。以下是一个简化的MATLAB代码示例&#xff0c;用于模拟一个基于…

centos在线安装部署2024年最新的docker版本

1.yum 包更新到最新 sudo yum update -y2.安装依赖软件包 sudo yum install -y yum-utils device-mapper-persistent-data lvm23.添加阿里的镜像&#xff0c;下载镜像速度比较快 sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/dock…

docker compse简介与安装

目录 1. Docker Compose 简介 2. Docker Compose 安装 2.1 在 Ubuntu 上安装 Docker Compose 2.1.1 通过 apt 安装 2.1.2 使用官方脚本安装最新版本 2.2 在 CentOS 上安装 Docker Compose 2.2.2 使用官方脚本安装最新版本 2.2.3 使用 pip 安装 2.3 在 openEuler 上安装…

【跨时代】第四次工业革命彻底来袭!什么是AI+

你有没有一种很割裂的感觉&#xff0c;就是在短视频里&#xff0c;AI已经要改变全世界了 但自己一用&#xff0c;却发现只能和AI聊聊天 画几张图 难道是姿势不对&#xff1f;但具体是哪里不对呢。 作为一个老牌程序员&#xff0c;我前面分享了很多计算机相关内容&#xff0c;总…

java基础概念06-原码、反码、补码

一、八位二进制的取值范围&#xff08;没有符号位&#xff09; 二、原码 三、反码 若是反码的计算结果跨0了&#xff0c;则会溢出&#xff0c;计算结果又误差&#xff01; 原因&#xff1a;在反码当中0有两种表现形式&#xff1a; 解决方式&#xff1a;将反码中的两个0&#x…

SSM大学生体质管理系统-计算机毕业设计源码75960

摘要 基于SSM的大学生体质管理系统是一款综合性平台&#xff0c;融合了在线课程、健康知识、体测报告等多项功能&#xff0c;旨在为广大大学生提供全方位的健康管理服务。通过在线课程和健康知识模块&#xff0c;用户可以随时学习健康知识&#xff0c;掌握科学的健康管理方法&a…

推荐一个比较好的开源位置服务平台

平台简介 一直想做一款后台管理系统&#xff0c;同时可以管理人&#xff0c;车&#xff0c;物品&#xff0c;猫&#xff0c;狗&#xff0c;牛羊等一切可以移动的室外事物进行集中化管理&#xff0c;最初的需求聚焦——谁在哪儿&#xff01; 系统框架是基于当前最常用的RuoYi框架…

C# 设计模式之创建者模式

总目录 前言 在软件系统中&#xff0c;有时需要创建一个复杂对象&#xff0c;并且这个复杂对象由其各部分子对象通过一定的步骤组合而成。例如一个采购系统中&#xff0c;如果需要采购员去采购一批电脑时&#xff0c;在这个实际需求中&#xff0c;电脑就是一个复杂的对象&…

DVWA (SQL注入 low)

&#xff08;1&#xff09;判断注入是字符型还是数值型 判断恒为真&#xff0c;字符型&#xff0c;输出ures表中全部用户信息。 1 or 123 123 # &#xff08;2&#xff09;猜测SQL查询字段数 1后面加 闭合 id 查询的 &#xff0c;末尾加# 是注释了后面 的内容&#xff…

LLM智能体工程落地思考(一)

人工智能领域著名教授吴恩达在今年3月份红杉资本的人工智能峰会(AI Ascent)以及最近Snowflake峰会开发者日上都发表了关于AI Agent(人工智能体)的演讲。演讲中&#xff0c;其分享了对AI Agent未来发展潜力的展望。认为AI Agent能够让人工智能胜任更多种类的任务&#xff0c;甚至…

STL源码刨析:树的导览

目录 1.前言 2.关联式容器 3.二叉搜索树 4.平衡二叉搜索树 前言 在阅读了STL源码刨析系列的前几章&#xff0c;我们可以知道容器分为序列式容器和关联式容器。在前几个小节中&#xff0c;我们对序列式容器中的vector和list容器进行了讲解&#xff0c;并比较了vector和list的区别…

学习记录——day24 多线程编程

目录 多线程局部概念 线程支持函数&#xff08;多线程编程&#xff09; pthread_create&#xff1a;创建线程 pthread -self&#xff1a;线程号获取 pthread_exit&#xff1a;线程退出函数 pthread_jion&#xff1a;线程资源回收 pthred_detath&#xff1a;线程分离态 p…

检索增强生成(RAG):智能内容生成的新纪元

引言 在大 AI 时代&#xff0c;生成式人工智能&#xff08;GenAI&#xff09;模型&#xff0c;尤其是大型语言模型&#xff08;LLM&#xff09;&#xff0c;已经展现出了令人瞩目的能力。然而&#xff0c;这些模型在提供信息的准确、即时、专业、权威等方面仍存在局限。检索增…

1.2、安装k8s-node1 和 k8s-node2节点虚拟机

k8s-master节点的虚拟机环境弄好之后&#xff0c;这小节继续介绍k8s-node1 和 k8s-node2节点虚拟机环境安装。 节点主机名ip主节点k8s-master172.31.0.10节点1k8s-node1172.31.0.11节点2k8s-node2172.31.0.12 在D:\vagrant目录下新建centos_stream_9_node1文件夹&#xff0c;然…