[转帖]RabbitMQ 死信队列

rabbitmq,死信,队列 · 浏览次数 : 0

小编点评

**死信交换机 DLX(Dead-Letter-Exchange)** **定义:** 死信交换机(DLX)是一种用于处理消息时出现异常或无法被消费者正确消费时将其放入死信队列的交换器。 **功能:** 当消息在一个正常的业务队列中变成死信时,它会被重新发送到另一个交换机中,即 DLX。DLX 是一个与一般的交换器相同的交换器,但它可以处理异常情况下,消息无法被消费者正确消费的状况。 **设置:** 可以设置 DLX 的属性参数,例如: * `x-dead-letter-exchange`:指定死信交换机的名称。 * `x-dead-letter-routing-key`:指定死信路由的键。 * `x-dead-letter-exchange-dead-letter-routing-key`:指定死信交换机和路由的键。 **使用场景:** 死信交换机可以用于处理以下异常情况: * 消息被拒绝(Basic.Reject/Basic.Nack) * 消息超时 *队列已满 * 消息已到达队列的末尾 **优点:** * 可以处理无法被消费者正确消费的消息。 * 可以实现延迟队列的功能。 * 可以帮助分析系统中遇到的异常。 **注意:** DLX 是一个可选的属性,如果要设置,请确保在队列的属性中指定正确的名称。

正文

https://blog.csdn.net/lamp_yang_3533/article/details/111463928

死信交换机

DLX(Dead-Letter-Exchange)可以称之为死信交换机,也称之为死信邮箱

当消息在一个正常的业务队列中变成死信(dead message)之后,它能被重新发送到另一个交换机中,这个交换机就是 DLX,绑定 DLX 的队列就是死信队列

如果一个正常的业务队列设置了死信邮箱,那么,在业务队列的消费者运行后,死信邮箱就会创建成功,并且在 RabbitMQ Management(web管理工具)的 Queues 菜单栏中,可以看到该业务队列 Features 栏会多出一个 DLX 标识。

死信(dead message)

以下几种情况,可能导致业务队列中的消息变成死信。

  • 消息被拒绝(Basic.Reject/Basic.Nack),并且 requeue 参数的值为 false 时。
  • 消息过期。
  • 队列达到最大长度,无法容纳新的消息时。

死信队列

DLX 也是一个正常的交换器,和一般的交换器没有区别,它能在任何的队列上被指定,实际上就是设置某个队列的属性。

当队列中存在死信时,RabbitMQ 就会自动地将该消息重新发布到设置的 DLX 中,进而被路由到另一个队列,即死信队列。

通过在 queueDeclare 方法中设置 x-dead-letter-exchange 属性参数来为这个队列指定 DLX。

也可以为这个队列指定 x-dead-letter-routing-key,如果没有明确指定,则使用原队列的 routing-key。

当然,这里也可以通过 Policy 的方式设置。

rabbitmqctl set_policy DLX ".*" '{"dead-letter-exchange": "dlx_exchange"}' --apply-to queues

    生产者首先发送一条携带路由键为 rk 的消息,然后经过交换器 exchange.normal 顺利地存储到队列 queue.normal 中。由于队列 queue.normal 设置了过期时间为 10s ,在这 10s 内没有消费者消费这条消息,那么判定这条消息为过期。由于设置了 DLX,过期之时,消息被丢给交换器 exchange.dlx 中,这时找到与 exchange.dlx 匹配的队列 queue.dlx,最后消息被存储在 queue.dlx 这个死信队列中。

    DLX 是一个非常有用的特性。它可以处理异常情况下,消息不能够被消费者正确消费(消费者调用了 Basic.Nack 或者 Basic.Reject)而被置入死信队列中的情况,后续分析程序可以通过消费这个死信队列中的消息来分析当时所遇到的异常,进而可以改善和优化系统。

    DLX 配合 TTL 使用还可以实现延迟队列的功能。

    与[转帖]RabbitMQ 死信队列相似的内容:

    [转帖]RabbitMQ 死信队列

    https://blog.csdn.net/lamp_yang_3533/article/details/111463928 死信交换机 DLX(Dead-Letter-Exchange)可以称之为死信交换机,也称之为死信邮箱。 当消息在一个正常的业务队列中变成死信(dead message)之后,

    [转帖]RabbitMQ服务优化,修改最大连接数

    https://www.cnblogs.com/hoyeong/p/16242202.html RabbitMQ的优化RabbitMQ的连接数是压垮消息队列的一个重要的指标。所以在平时使用OpenStack平台的过程中,如果大量的用户同时创建虚拟机,会导致云平台创建报错,其实就是消息队列服务的崩溃。

    [转帖]RabbitMQ性能优化

    https://www.cnblogs.com/zhengchunyuan/p/9253728.html 修改rabbitmq.config文件 rabbitmq.config文件时rabbitmq的配置文件,他遵守Erlang配置文件定义。 rabbitmq.config文件位置: Unix $R

    [转帖]RabbitMQ的Vhost,Exchange,Queue原理分析

    RabbitMQ的Vhost,Exchange,Queue原理分析https://www.cnblogs.com/zhengchunyuan/p/9253725.html Vhost分析 RabbitMQ的Vhost主要是用来划分不同业务模块。不同业务模块之间没有信息交互。 Vhost之间相互完全隔

    [转帖]RabbitMQ 的重要概念(术语)

    Message 消息指的是 RabbitMQ 的队列中保存的数据。 Producer 消息的生产者,即 message publisher(sender),是指负责创建和发送消息的程序。 Vhost RabbitMQ 的虚拟主机,一个 broker 里可以开设多个 vhost,用作不同用户的权限分离

    [转帖]RabbitMQ基础概念详细介绍

    https://www.jianshu.com/p/e55e971aebd8 AMQP简介 AMQP,即 Advanced Message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。消息中间件主要用于组件之间的解耦和通讯。 AMQP的主要

    [转帖]RabbitMQ 如何保证交换机中的消息不丢失

    我们知道,生产者会先将消息发送给交换机,但是如果交换机此时没有匹配到相关的队列时,交换机中的消息就会出现丢失的问题。 那么,如何保证交换机中的消息不丢失呢? mandatory 参数 当 basicPublish 方法的 mandatory 参数设为 true 时,如果交换器无法匹配到绑定的队列,那

    [转帖]RabbitMQ:Exchange的Fanout类型的介绍和使用

    https://blog.csdn.net/weixin_45492007/article/details/106095591 1.声明 当前的内容用于本人学习和使用Fanout类型的Exchange,主要理解其主要作用 2.Fanout Exchange的官方介绍 扇出交换机将消息路由到与其绑定的

    [转帖]RabbitMQ 消费者回执和发布确认

    为了保证数据安全,消费者和生产者的回执(ack)都是非常重要的。 由于我们无法保证消息都能像我们期望的那样,正常到达另一端或者被 Consumer 消费成功。因此,publisher 和 consumer 都需要一种机制,来确保消息投递成功了和消息消费成功了。 在 AMQP 0-9-1 中,消费者处

    [转帖]RabbitMQ学习笔记01:初识与安装

    https://www.cnblogs.com/alongdidi/p/rabbitmq_overview.html 原作者写的真好. 前言 本人是一名运维工程师,在此公司接触到 RabbitMQ ,平时针对此软件的工作内容就是集群的安装以及配置监控等,对其的理解也仅仅是知道其是一种消息队列的服务,