Java小案例-RocketMQ的11种消息类型,你知道几种?(死信消息)

前言

在RocketMQ中,死信消息(Dead-Letter Message)是指那些在正常情况下无法被消费者消费的消息。这些消息会被存储在死信队列(Dead-Letter Queue,简称DLQ)中。

死信消息的特性包括:

  1. 不会再被消费者正常消费:一旦消息被标记为死信消息,它们将不会被正常的消费者消费。
  2. 有效期与正常消息相同,均为3天:死信消息的有效期与正常消息相同,均为3天。这意味着在死信消息产生后的3天内,如果消费者没有处理该消息,它将被自动删除。
  3. 死信队列特性:一个死信队列对应一个Group ID,而不是对应单个消费者实例。如果一个Group ID未产生死信消息,RocketMQ不会为其创建相应的死信队列。一个死信队列包含对应Group ID产生的所有死信消息,不论该消息属于哪个Topic。

使用死信队列可以帮助消费者在处理消息失败时,将失败的消息重新发送到指定的队列,以便进行进一步的处理或分析。

死信消息

死信消息就是指如果消息最终无法被正常消费,那么这条消息就会成为死信消息

RocketMQ中,消息会变成死信消息有两种情况

第一种就是消息重试次数已经达到了最大重试次数

最大重试次数取决于并发消费还是顺序消费

  • 顺序消费,默认最大重试次数就是 Integer.MAX_VALUE,基本上就是无限次重试,所以默认情况下顺序消费的消息几乎不可能成为死信消息

  • 并发消费的话,那么最大重试次数默认就是16次

当然可以通过如下的方法来设置最大重试次数

DefaultMQPushConsumer#setMaxReconsumeTimes

除了上面的情况之外,当在并发消费模式下,你可以在消息消费失败之后手动指定,直接让消息变成死信消息

在并发消费消息的模式下,处理消息的方法有这么一个参数

ConsumeConcurrentlyContext

这个类中有这么一个属性

这个参数值有三种情况,注释也有写:

  • 小于0,那么直接会把消息放到死信队列,成为死信消息。注释写的是=-1,其实只要小于0就可以成为死信消息,不一定非得是-1

  • 0,默认就是0,这个代表消息重试消费,并且重试的时间间隔(也就是延迟级别)由服务端决定,也即是前面重试消息提到的 delayLevel = 3 + 已经重试次数

  • 大于0,此时就表示客户端指定消息重试的时间间隔,是几就代表延迟级别为几,比如设置成1,那么延迟级别就为1

所以,在并发消费模式下,可以通过设置这个参数值为-1,直接让处理失败的消息成为死信消息

当消息成为死信消息之后,消息并不会丢失

RocketMQ会将死信消息保存在死信Topic底下,Topic格式为

%DLQ% + 消费者组名称

跟重试Topic的格式有点像,只是将%RETRY%换成了%DLQ%

如果你想知道有哪些死信消息,只需要订阅这个Topic即可获得

总结

所以总的来说,两种情况会让消息成为死信消息:

  • 消息重试次数超过最大次数,跟消息的处理方式有关,默认情况下顺序处理最大次数是几乎是无限次,也就是几乎不可能成为死信消息;并发处理的情况下,最大重试次数默认就是16次。最大重试次数是可以设置的。

  • 在并发处理的情况下,通过ConsumeConcurrentlyContextdelayLevelWhenNextConsume属性设置成-1,让消息直接变成死信消息

当消息成为死信消息的时候,会被存到%DLQ% + 消费者组名称这个Topic下

用户可以通过这个Topic获取到死信消息,手动干预处理这些消息

联系方式

关于文章中大家有任何疑问可以通过关注公众号《编程乐学》进行留言,同时,公众号还有更多有趣的项目以及关于学习编程的笔记资料大家可以看看,欢迎大家进行留言。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RocketMQ EventBridge 核心概念

理解EventBridge中的核心概念,能帮助我们更好的分析和使用EventBridge。本文重点介绍下EventBridge中包含的术语: EventSource:事件源。用于管理发送到EventBridge的事件,所有发送到EventBridge中的事件都必须标注事件源名称信息…

关键字、标识符、变量、基本数据类型

一、关键字(Keyword) 定义:被Java语言赋予了特殊含义,用做专门用途的字符串(或单词) 特点:全部关键字都是小写字母 Java关键字查询关键地址: http:// https://docs.oracle.com/j…

微服务——服务异步通讯(MQ高级)

MQ的一些常见问题 消息可靠性 生产者消息确认 返回ack,怎么感觉这么像某个tcp的3次握手。 使用资料提供的案例工程. 在图形化界面创建一个simple.queue的队列,虚拟机要和配置文件里面的一样。 SpringAMQP实现生产者确认 AMQP里面支持多种生产者确认的类…

Jmeter 性能-负载阶梯场景

1、安装阶梯测试的第三方插件->搜jpgc 选项-JMeter Plugins Manager -搜jpgc 空格,然后安装 2、脚本-线程组选jpgc Stepping Thread Group 最终并发数为100,并发数从0开始,5秒内增加10个并发数,增加10个后持续30s,…

[C++]——STL简介

带你了解c的STL 前言:一、什么是STL?二、STL有什么版本?三、STL的组件有哪些?四、如何学习STL?五、总结 前言: 我写这个博客,是为了在学习过程中能够更加有条理,更加全面,更加清晰的学习STL。…

Pipelined-ADC设计一:序言

现在是2023年12月18日,准备开新帖,设计一个 流水线型 模数转换器( Pipelined-ADC )。记录帖,后续会放在咸鱼。同步记录,谨防盗用。 初定指标:12位50Mhz,采用2.5bit每级结构&#xff…

教育机构小程序管理系统的全方位优化

随着互联网的快速发展,线上教育也日益受到人们的关注和欢迎。为了满足广大学生和家长的需求,教育机构纷纷开发出自己的小程序管理系统。本文将详细介绍如何使用乔拓云平台,一键开发出自己的教育机构小程序管理系统。 1.进入乔拓云后台 首先&…

C# 使用FluentHttpClient请求WebApi

写在前面 FluentHttpClient 是一个REST API 异步调用 HTTP 客户端,调用过程非常便捷,采用流式编程,可以将所有请求所需的参数一次性发送,并直接获取序列化后的结果。 老规矩从NuGet上安装该类库: 这边一定要认准是 P…

检测车牌的SIFT特征并匹配

# 代码5-14 检测车牌的SIFT特征并匹配 import cv2img1 cv2.imread(../data/plate.jpg) img2 cv2.imread(../data/car.jpg)sift cv2.SIFT_create() # 利用sift.detectAndCompute()函数找到特征点,计算描述符; kp1, des1 sift.detectAndCompute(img1, …

Git提交前的必备神器——自动清除调试语句脚本

说在前面 不知道大家有没有遇到这样一种情况,平时在写代码调试时有时候会使用到debugger,可能大部分时间在提交代码前会记得把debugger先删除,但可能也会存在将debugger提交上去的情况,那我们该怎么防止出现这种情况呢&#xff1f…

C语言—每日选择题—Day53

指针相关博客 打响指针的第一枪&#xff1a;指针家族-CSDN博客 深入理解&#xff1a;指针变量的解引用 与 加法运算-CSDN博客 第一题 1. 有以下程序&#xff0c;输出的结果为&#xff08;&#xff09; #include <stdio.h> int main() {char a H;a (a > A &&…

【03】GeoScene创建海图或者电子航道图数据

1 配置Nautical属性 1.1 管理长名称 长名称&#xff08;LNAM&#xff09;是一个必要的对象标识符&#xff0c;是生产机构&#xff08;AGEN&#xff09;、要素识别号码&#xff08;FIDN&#xff09;和要素识别子项&#xff08;FIDS&#xff09;组件的串联。这三个子组件用于数…