rocketmq:死信队列和消息幂等

author author     2023-04-24     710

关键词:

参考技术A 上一篇 《RocketMQ:消息重试》 中我们提到当一条消息消费失败时,RocketMQ会进行一定次数的重试。重试的结果也很简单,无非就是在第N次重试时,被成功消费。或者就是经过M次重试后,仍然没有被消息。这通常是由于消费者在正常情况下无法正确地消费该消息。此时,RocketMQ不会立即将消息丢弃,而是将其发送到该消费者对应的特殊队列中去。

在RocketMQ中,这种正常情况下无法被消费的消息被称为死信消息(Dead-Letter Message),存储死信消息的特殊队列称为死信队列(Dead-Letter Queue)。

(1)死信消息具有以下特性:

(2)死信队列具有以下特性:

(1)在控制条查询出现死信队列的主题信息

(2)在消费界面根据主题查询死信消息

(3)选择重新发送消息

一条消息进入死信队列,意味着某些因素导致消费者无法正常消费该消息。因此,通常需要我们对其进行特殊处理。排查可疑因素并解决问题后,可以在消息队列 RocketMQ 控制台重新发送该消息,让消费者重新消费一次。

RocketMQ并不保证一条消息只会被推送一次,因此一条消息就有可能被消费多次。消费者在接收到消息以后,有必要根据业务上的唯一 Key 对消息做幂等处理的必要性。

在互联网应用中,尤其在网络不稳定的情况下,RocketMQ 的消息有可能会出现重复,这个重复简单可以概括为以下情况:

因为 Message ID 有可能出现冲突(重复)的情况,所以真正安全的幂等处理,不建议以 Message ID 作为处理依据。 最好的方式是以业务唯一标识作为幂等处理的关键依据,而业务的唯一标识可以通过消息 Key 进行设置:

消费方收到消息时可以根据消息的 Key 进行幂等处理:

rocketmq的死信队列

...丢弃,而是将其发送到该消费者对应的特殊队列中。RocketMQ将这种正常情况下无法被消费的消息称为死信消息(Dead-LetterMessage),将存储死信消息的特殊队列称为死信队列(Dead-LetterQueue),简称DLQ。如... 查看详情

rocketmq的死信队列

...丢弃,而是将其发送到该消费者对应的特殊队列中。RocketMQ将这种正常情况下无法被消费的消息称为死信消息(Dead-LetterMessage),将存储死信消息的特殊队列称为死信队列(Dead-LetterQueue),简称DLQ。如... 查看详情

rocketmq使用之消息保证,重复读,积压,顺序,过滤,延时,事务,死信

...投递和不重复投递是很难的,就是所谓的有且仅有一次。RocketMQ择了确保一定投递,保证消息不丢失,但有可能造成消息重复。处理消息重复问题,主要有业务端自己保证,主要的方式有两种:业务幂等和消息去重发生了消息积... 查看详情

阿里云-ons-help:消息队列rocketmq版

ylbtech-阿里云-ONS-Help:消息队列RocketMQ版 1.返回顶部1、消息队列RocketMQ版 查看产品>消息队列RocketMQ版是阿里云基于ApacheRocketMQ构建的低延迟、高并发、高可用、高可靠的分布式消息中间件。产品更新 常见问题立即购... 查看详情

rocketmq重试队列与死信队列简介

1、消费者异常了怎么办?假设我们使用RocketMQ作为消息中间件,传输订单相关的数据,消费者拿到数据后,执行一些后续处理,比如调用物流系统,准备发货。如果这时候,物流系统的数据库宕机了... 查看详情

rocketmq延时消息实现原理探究(代码片段)

由于日常开发中遇到几次使用延时消息的场景,而且目前业务中使用到的消息中间件有rabbitmq和kafka,对延时消息的支持都不太理想。其中rabbitmq延时消息是通过设置队列ttl+死信exchange实现缺点嘛:每次都得设置两... 查看详情

rocketmq重试队列与死信队列简介

1、消费者异常了怎么办?假设我们使用RocketMQ作为消息中间件,传输订单相关的数据,消费者拿到数据后,执行一些后续处理,比如调用物流系统,准备发货。如果这时候,物流系统的数据库宕机了... 查看详情

rabbitmq:第二章:spring整合rabbitmq(简单模式,广播模式,路由模式,通配符模式,消息可靠性投递,防止消息丢失,ttl,死信队列,延迟队列,消息积压,消息幂等性)(代码(代码片段)

系列文章目录RabbitMQ:第一章:6种工作模式以及消息确认机制(理论与代码相结合)RabbitMQ:第二章:Spring整合RabbitMQ(简单模式,广播模式,路由模式,通配符模式,消息可靠性投递... 查看详情

rocketmq源码(23)—defaultmqpushconsumer消费者重试消息和死信消息源码(代码片段)

...息均会有消息重试机制。此前已经学了相关的知识:RocketMQ的消费者消息重试和生产者消息重投,现在我们来看看他们的源码。文章目录1并发消费重试1.1失败重试1.1.1ConsumeMessageConcurrentlyService#sendMessageBack发送消费失败的... 查看详情

mq死信队列

RabbitMQ死信队列俗称,备胎队列;消息中间件因为某种原因拒收该消息后,可以转移到死信队列中存放,死信队列也可以有交换机和路由key等。产生死信队列的原因消息投递到MQ中存放消息已经过期队列达到最大的长度(队列容... 查看详情

rabbitmq学习笔记(代码片段)

...重复消费问题1.什么幂等性2.业务代码中实现幂等性九、死信队列——“延迟”队列 1.死信队列的介绍2.消息成为死信的条件3.创建死信队列十、demo源码一、引⾔MessageQueue(消息队列),从字⾯上理解:⾸先它是⼀... 查看详情

rocketmq-如何用死信队列解决消费者异常

...个回调函数中对消息进行处理,处理完之后,就可以告诉RocketMQConsumer这批消息的处理结果。比如,如果返回的是CONSUME_SUCCESS,那么Consumer就知道这批消息处理完成了,就会提交这批消息的offset到broker上去,然后下次就会继续从bro... 查看详情

利用rabbitmq的死信队列实现延时消息(代码片段)

mq基本的消息模型mq死信队列的消息模型简单的说就是先弄一个正常队列,然后不要设置消费者,接着给这个正常队列绑定一个死信队列,这个死信队列设置方式和正常队列没啥区别。然后监听这个死信队列的消费.一... 查看详情

rabbitmq死信队列(代码片段)

死信队列DLX,全称为Dead-LetterExchange,可以称之为死信交换器,也有人称之为死信邮箱.当消息在一个队列中变成死信(deadmessage)之后,它能被重新被发送到另一个交换器中,这个交换器就是DLX,绑定DLX的队列就称之为死信队列。消息... 查看详情

rabbitmq—springboot中实现死信队列(代码片段)

文章目录一、什么是死信、死信队列?1.死信2.死信队列二、如何配置死信队列?1.yml配置文件2.声明业务队列和死信队列3.生产者4.消费者5.RabbitMQ控制台检验三、测试死信及如何处理死信1.自动ack超过重试次数进入死信队... 查看详情

gorabbitmq死信消息队列(代码片段)

...列超时,执行逻辑     *主要测试一个死信队列,功能主要实现延时消费,原理是先把消息发到正常队列, *正常队列有超时时间,当达到时间后自动发到死信队列,然后由消费者去消费死信队列里的消息.*/&... 查看详情

使用rabbitmq处理死信队列

参考技术ADLX,全称为Dead-Letter-Exchange,死信交换器。消息在一个队列中变成死信(DeadLetter)之后,被重新发送到一个特殊的交换器(DLX)中,同时,绑定DLX的队列就称为“死信队列”。在定义业务队列时可以考虑指定一个死信... 查看详情

正确计算发送到死信 SQS 队列的消息数

】正确计算发送到死信SQS队列的消息数【英文标题】:CorrectlycalculatenumberofsentmessagestoDeadLetterSQSqueue【发布时间】:2019-10-1000:10:09【问题描述】:我希望grafana在任何给定时间报告死信队列中有多少消息。由于最终进入此队列的性... 查看详情