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

rabbitmq,如何,保证,交换机,消息,丢失 · 浏览次数 : 0

小编点评

** mandatory 参数** * 当 `true` 时,如果交换机无法匹配到绑定的队列,则 RabbitMQ 会调用 `Basic.Return` 命令将消息返回给生产者。 * 当 `false` 时,若出现上述情形,则消息直接被丢弃。 **获取被 RabbitMQ 返回的消息** * 当 `mandatory` 参数设为 `true` 时,生产者可以通过 `channel.addReturnListener()` 添加 `ReturnListener` 监听器,并在 `ReturnListener` 中处理被 RabbitMQ 返回的消息。 **备份交换机** * 当使用备份交换机时,如果 AE 不存在,客户端和 RabbitMQ 服务端不会出现异常。 * 当 AE 没有绑定任何队列,客户端和 RabbitMQ 服务端不会出现异常。 * 当 AE 没有匹配到队列,客户端和 RabbitMQ 服务端不会出现异常。 * 当同时使用了 AE 和 `mandatory` 参数时,那么 `mandatory` 参数无效。

正文

我们知道,生产者会先将消息发送给交换机,但是如果交换机此时没有匹配到相关的队列时,交换机中的消息就会出现丢失的问题。

那么,如何保证交换机中的消息不丢失呢?

mandatory 参数

当 basicPublish 方法的 mandatory 参数设为 true 时,如果交换器无法匹配到绑定的队列,那么 RabbitMQ 会调用 Basic.Return 命令将消息返回给生产者。

当 mandatory 参数设置为 false 时,若出现上述情形,则消息直接被丢弃。

那么,当 mandatory 参数设为 true 时,生产者如何获取被 RabbitMQ 返回的消息呢?这时,可以调用 channel.addReturnListener 来添加 ReturnListener 监听器实现。

备份交换机

备份交换机(Alternate Exchange)简称 AE,可以理解为备胎交换机。

生产者发送消息时,如果不设置 mandatory 参数,消息在未被正确路由的情况下会丢失;如果设置 mandatory 参数为 true,又需要添加 ReturnListener 的业务处理逻辑,生产者的代码将变得复杂。

如果既不想复杂化生产者的业务逻辑,又不想消息丢失,那么可以使用备份交换器。这样,它可以将未被路由的消息存储在 RabbitMQ 中,再在必要时去处理这些消息。

在声明交换机(exchangeDeclare 方法)时,添加 alternate-exchange 属性参数来实现。还需要声明该备份交换机,并给其绑定一个新的队列。

其实,备份交换器和普通的交换器没有太大的区别,为了方便使用,建议将 AE 设置为 fanout 类型。

注意: 消息被重新发送给备份交换机的路由键和从生产者发出的路由键是一样的。

对于备份交换机,需要考虑以下几种特殊情况:

  • 如果设置的 AE 不存在,客户端和 RabbitMQ 服务端都不会出现异常,此时消息会丢失。
  • 如果 AE 没有绑定任何队列,客户端和 RabbitMQ 服务端都不会出现异常,此时消息会丢失。
  • 如果 AE 没有匹配到队列,客户端和 RabbitMQ 服务端都不会出现异常,此时消息会丢失。
  • 如果同时使用了 AE 和 mandatory 参数,那么 mandatory 参数无效。

与[转帖]RabbitMQ 如何保证交换机中的消息不丢失相似的内容:

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

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

[转帖]如何选择RabbitMQ的消息保存方式?

https://www.cnblogs.com/zhengchunyuan/p/10179677.html RabbitMQ对于queue中的message的保存方式有两种方式:disc和ram。如果采用disc,则需要对exchange/queue/delivery mode都要设置成durabl

[转帖]RabbitMQ高可用性

RabbitMQ消息应答 执行一个任务可能需要花费几秒钟,你可能会担心如果一个消费者在执行任务过程中挂掉了。一旦RabbitMQ将消息分发给了消费者,就会从内存中删除。在这种情况下,如果正在执行任务的消费者宕机,会丢失正在处理的消息和分发给这个消费者但尚未处理的消息。 但是,我们不想丢失任何任务,如

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

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

[转帖]使用docker快速构建RabbitMQ

https://www.cnblogs.com/shanfeng1000/p/16261011.html 有时间,我们需要rabbitmq测试一下,如果按照原方案部署一个rabbitmq,比较麻烦,这个时候可以使用docker快速构建一个rabbitmq来使用。 rabbitmq:managemen

[转帖]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 死信队列

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