RabbitMQ 备份交换机和死信交换机

这篇具有很好参考价值的文章主要介绍了RabbitMQ 备份交换机和死信交换机。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

  为处理生产者将消息推送到交换机中,交换机按照消息中的路由键及自身策略无法将消息投递到指定队列中造成消息丢失的问题,可以使用备份交换机。
  为处理在消息队列中到达TTL的过期消息,可采用死信交换机进行消息转存。可以通过死信交换机的方式实现延迟队列的需求。
  为实现消息优先消费可以针对队列和消息设置优先级,在消息积压的情况下优先级高的消息将优先被消费。
  通过上述描述可知,备份交换机和死信交换机处理的场景不同。备份交换机是处理未被路由的消息,死信交换机是处理队列中过期的消息。但是,它们都是为了避免消息丢失提供的一种手段。

备份交换机

  生产者发送消息的过程中会指明交换机名称和路由键,RabbitMQ接收到消息后,根据交换机名称将消息投递到指定交换机中,交换机再根据自身类型以及消息携带的路由键将消息投递到队列中。当无法路由到队列时,并且该交换机存在备份交换机,则该交换机将该消息投递给其备份交换机进行处理。
  备份交换机接收到消息后依旧根据其自身类型和消息路由键进行消息投递,如果依旧无法匹配到队列中,则该消息被丢失。该过程中的具体流程如下图所示。
RabbitMQ 备份交换机和死信交换机,中间件 - RabbitMQ,rabbitmq,中间件

备份交换机的实现

  备份交换机的实现方式包括:声明交换机时通过参数配置和通过策略进行配置。申明交换机时配置备份交换机如下所示。

 Map<String, Object> args = new HashMap<>();
 args.put("alternate-exchange","myAe");      
 channel.exchangeDeclare("normalExchange","direct",true,false,args);
 channel.exchangeDeclare("myAe","fanout",true,false,null);

  通过上述代码即实现了声明两个交换机,其中交换机myAe是normalExchange的备份交换机。备份交换机可以理解为一个普通交换机,备份交换机自身并不知晓自己是备份交换机,当某个消息无法被路由到队列中时,该交换机会查找自己的备份交换机,如果存在则将消息交由备份交换机进行处理。
  需要说明的时,备份交换机在消息入队的时候也会根据自身类型进行路由匹配,消息重发到备份交换机时路由键和从生产者发送时的路由键一致,如果是直接交换机或者主题交换机,则依旧可能会导致消息丢失,因此备份交换机建议采用扇形交换机。
备份交换机存在以下特殊情况

  • 如果备份交换机和mandatory参数一起使用,则mandatory参数无效。
  • 如果备份交换机不存在,则消息丢失且生产者和RabbitMQ都不会有异常出现。
  • 如果备份交换机没有绑定队列,则消息丢失且生产者和RabbitMQ都不会有异常出现。
  • 如果备份交换机依旧无法将消息路由到队列,则消息丢失且生产者和RabbitMQ都不会有异常出现。

死信交换机

  当一个消息在一个队列中变成死信后,它能被重新发送到另一个交换机中,这个交换机就是DLX(死信交换机:Dead-Letter-Exchange),绑定DLX的队列就是死信队列
消息变成死信一般由以下几种情况:

  • 消息被消费者拒绝,并且设置不可重新入队
  • 消息过期(TTL)
  • 队列达到最大长度。

  根据上述描述,队列中的消息变成死信后将转发给死信交换机,因此死信交换机的设置是在声明队列的过程中完成的。死信交换机和备份交换机类似,其自身并不知道自己是死信交换机,仅指定其为死信交换机的队列知道其死信交换机身份的存在,本质上死信交换机和正常交换机并不存在区别。
  死信交换机的设置可通过声明队列时设置和通过策略设置两种方式实现。声明队列时设置如下所示:

Map<String, Object> args = new HashMap<>();
// 声明该队列的死信交换机为”dlx_exchange“
args.put("x-dead-letter-exchange","dlx_exchange");
// 声明死信交由死信交换机处理时将路由键替换为dlx-routing-key
args.put("x-dead-letter-routing-key","dlx-routing-key");
channel.queueDeclare("queue",false,false,false,args);

死信交换机存在以下特殊情况

  • 如果死信交换机不存在,则消息丢失且RabbitMQ都不会有异常出现。
  • 如果死信交换机没有绑定队列,则消息丢失且RabbitMQ都不会有异常出现。
  • 如果死信交换机依旧无法将消息路由到队列,则消息丢失且RabbitMQ都不会有异常出现。

延迟队列

  延迟队列是指当消息发送完成后,消费者间隔一段时间后消费该消息,可以通过死信队列的方式实现延迟队列,生产者把消息发送给设置了过期时间的队列中,该队列不存在消费者,待消费过期后消息会被投递到延迟队列(死信队列),消费者消费延迟队列中的消息,这样就实现了消息的延迟处理。

优先级队列

  可以针对队列和消息设置消息,在消息积压的情况下消费者可以优先消费高优先级的消息。
  仅向设置优先级的队列中发送具备优先级的消息优先级设置才有效,如果仅对消息设置优先级则优先级设置无效。
  消息的优先级默认为0,最高为队列设置的最大优先级,如果设置的消息优先级大于队列设置的最大优先级,则按照队列最大优先级进行计算。
设置队列为优先级队列如下所示:

Map<String,Object> map = new HashMap<>();
map.put("x-max-priority",10);
channel.queueDeclare(QUEUE_NAME,true,false,false,map);

发送具备优先级的消息如下所示:

AMQP.BasicProperties.Builder builder = new AMQP.BasicProperties.Builder();
builder.priority(20000);
AMQP.BasicProperties basicProperties = builder.build();
channel.basicPublish(EXCHANGE_NAME ,ROUTING_KEY,basicProperties,msg.getBytes());

  优先级队列存在以下几点需要注意:文章来源地址https://www.toymoban.com/news/detail-631482.html

  • 仅在消息积压的情况下优先级队列的设置才有意义
  • 设置优先级的消息仅在优先级队列中才能体现出优先级消费
  • 一旦消息中的优先级设置大于队列的优先级,则按照队列的优先级进行计算

总结

比较 备份交换机 死信交换机 优先级队列
作用 消息无法路由到队列中后交由备份交换机进行处理 消息从队列成为死信后交由死信交换机进行处理 挤压消息在优先级队列中可以按照优先级高低被消费者消费
设置方法 给某个交换机设置备份交换机,备份交换机自身不知道自己备份交换机的身份 给某个队列设置死信交换机,死信交换机本身不知道自己死信交换机的身份 设置某个队列的优先级,在发送消息的过程中也声明消息优先级

到了这里,关于RabbitMQ 备份交换机和死信交换机的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【RabbitMQ】 RabbitMQ 消息的延迟 —— 深入探索 RabbitMQ 的死信交换机,消息的 TTL 以及延迟队列

    消息队列是现代分布式应用中的关键组件,用于实现异步通信、解耦系统组件以及处理高并发请求。消息队列可以用于各种应用场景,包括任务调度、事件通知、日志处理等。在消息队列的应用中,有时需要实现消息的延迟处理、处理未能成功消费的消息等功能。 本文将介绍

    2024年02月05日
    浏览(78)
  • .NetCore 使用 RabbitMQ (交换机/队列/消息持久化+mq高级特性+死信队列+延迟队列)

    目录 一、安装mq 二、实操 1、简单模式 2、工作模式 3、fanout扇形模式(发布订阅) 4、direct路由模式也叫定向模式 5、topic主题模式也叫通配符模式(路由模式的一种) 6、header 参数匹配模式 7、延时队列(插件方式实现) 参考资料: 1、我的环境是使用VMware安装的Centos7系统。MQ部署

    2023年04月09日
    浏览(103)
  • RabbitMQ学习笔记(消息发布确认,死信队列,集群,交换机,持久化,生产者、消费者)

    MQ(message queue):本质上是个队列,遵循FIFO原则,队列中存放的是message,是一种跨进程的通信机制,用于上下游传递消息。MQ提供“逻辑解耦+物理解耦”的消息通信服务。使用了MQ之后消息发送上游只需要依赖MQ,不需要依赖其它服务。 功能1:流量消峰 功能2:应用解耦 功

    2024年02月07日
    浏览(54)
  • RabbitMQ:概念和安装,简单模式,工作,发布确认,交换机,死信队列,延迟队列,发布确认高级,其它知识,集群

    1.1.1.什么是MQ MQ(message queue:消息队列) ,从字面意思上看,本质是个 队列 , FIFO 先入先出 ,只不过队列中存放的 内容是message 而已 ,还是一种 跨进程的通信机制 , 用于上下游传递消息 。在互联网架构中,MQ 是一种非常常见的上下游 “逻辑解耦+物理解耦” 的消息通信服

    2024年01月20日
    浏览(75)
  • 【学习日记2023.6.19】 之 RabbitMQ服务异步通信_消息可靠性_死信交换机_惰性队列_MQ集群

    消息队列在使用过程中,面临着很多实际问题需要思考: 消息从发送,到消费者接收,会经历多个过程: 其中的每一步都可能导致消息丢失,常见的丢失原因包括: 发送时丢失: 生产者发送的消息未送达exchange 消息到达exchange后未到达queue MQ宕机,queue将消息丢失 consumer接收

    2024年02月11日
    浏览(58)
  • 死信交换机&延迟队列

    说明:在MQ中,当一个队列中的消息出现以下情况时,就成为了死信(Dead Letter); 被消费者拒绝消费或者声明失败,并且requeue设置为false,即不再重新入队列; 队列中的消息存满,消息无法再入队列; 消息过期 此时,可以通过指定死信交换机,把这些消息路由到一个专门

    2024年02月16日
    浏览(41)
  • 交换机IOS升级及备份方法详细介绍

    我们先确保要升级或备份IOS的交换机能跟我们的PC电脑正常通信。 一、工具及笔记本设置 这里建议交换机就在我们的身边,因为这样保险点,出了问题有人在现场会容易处理。 这里我们按交换机是无任何配置的交换机设置   1. 物理连接交换机控制口及网卡 交换机通电后,我

    2024年02月05日
    浏览(42)
  • RabbitMQ之Exchange(交换机)属性及备用交换机解读

    目录 基本介绍 主要结论 备用交换机  springboot代码实战(备用交换机) 实战架构 工程概述 RabbitConfigDeal 配置类:创建队列及交换机并进行绑定  MessageService业务类:发送消息及接收消息 主启动类RabbitMq01Application:实现ApplicationRunner接口 在 RabbitMQ 中,交换机主要用来将生产

    2024年02月02日
    浏览(50)
  • H3C交换机配置文件自动备份

    目录 一、自动配置文件需求 二、环境条件 三、自动配置文件备份思路 四、搭建SCP服务器(其实就是SSH服务器) 五、交换机配置自动备份 六、常见问题 七、官方产品文档参考资料 1.7.2  配置备份参数 1.7.3  备份当前配置 网络中有多台华三交换机,需要每天一定时自动备份

    2024年02月07日
    浏览(47)
  • 【RabbitMQ】RabbitMQ的交换机

    在上文中, 都没有交换机,生产者直接发送消息到队列。 而一旦引入交换机,消息发送的模式会有很大变化:可以看到,在订阅模型中,多了一个exchange角色,而且过程略有变化: Publisher:生产者,不再发送消息到队列中,而是发给交换机 Exchange:交换机,一方面,接收生

    2024年03月12日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包