RabbitMQ之死信队列

rabbitmq 同时被 2 个专栏收录
54 篇文章 47 订阅
117 篇文章 220 订阅

欢迎支持笔者新作:《深入理解Kafka:核心设计与实践原理》和《RabbitMQ实战指南》,同时欢迎关注笔者的微信公众号:朱小厮的博客。
在这里插入图片描述
欢迎跳转到本文的原文链接:https://honeypps.com/mq/rabbitmq-analysis-of-dlx/

DLX, Dead-Letter-Exchange。利用DLX, 当消息在一个队列中变成死信(dead message)之后,它能被重新publish到另一个Exchange,这个Exchange就是DLX。消息变成死信一向有一下几种情况:

DLX也是一个正常的Exchange,和一般的Exchange没有区别,它能在任何的队列上被指定,实际上就是设置某个队列的属性,当这个队列中有死信时,RabbitMQ就会自动的将这个消息重新发布到设置的Exchange上去,进而被路由到另一个队列,可以监听这个队列中消息做相应的处理,这个特性可以弥补RabbitMQ 3.0以前支持的immediate参数(可以参考RabbitMQ之mandatory和immediate)的功能。

核心代码实现:通过在queueDeclare方法中加入“x-dead-letter-exchange”实现。

channel.exchangeDeclare("some.exchange.name", "direct");

Map<String, Object> args = new HashMap<String, Object>();
args.put("x-dead-letter-exchange", "some.exchange.name");
channel.queueDeclare("myqueue", false, false, false, args);

你也可以为这个DLX指定routing key,如果没有特殊指定,则使用原队列的routing key

args.put("x-dead-letter-routing-key", "some-routing-key");

还可以使用policy来配置:

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

修改RabbitMQ之TTL(Time-To-Live 过期时间)中的例子:

public static void createQueue(){
    try {
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost(ip);
        factory.setPort(port);
        factory.setUsername(username);
        factory.setPassword(password);

        Connection connection = factory.newConnection();
        Channel channel = connection.createChannel();

        Map<String, Object>  argss = new HashMap<String, Object>();
        argss.put("vhost", "/");
        argss.put("username","root");
        argss.put("password", "root");
        argss.put("x-message-ttl",6000);
        argss.put("x-dead-letter-exchange","exchange.dlx.test");
 argss.put("x-dead-letter-routing-key","queue.dlx.test");
        channel.queueDeclare("queue.dlx.test", durable, exclusive, autoDelete, argss);
    } catch (IOException e) {
        e.printStackTrace();
    } catch (TimeoutException e) {
        e.printStackTrace();
    }
}

通过RabbitMQ的管理界面可以看到:
这里写图片描述
queue.dlx.test这个queue中有个“DLX"和“DLK”的标记. DLX关联的是exchangeName, DLK关联的是routingKey.

详细说明:
在RabbitMQ中有两个exchange: exchange.dlx.self和exchange.dlx.test,两个queue:queue.dlx.test和%DLX%queue.dlx.test
exchange.dlx.self是正常情况下,生产者发送消息到此exchange中,绑定关系如图:
这里写图片描述
exchang.dlx.test是产生死信之后,原queue[queue.dlx.test]的死信发送到此exchange中,绑定关系如图:
这里写图片描述

数据首先发送到 exchange[exchange.dlx.self],根据routingkey[dlx]路由到queue.dlx.test,如果正常情况下,消费者可以消费queue.dlx.test的内容。但是如果queue.dlx.test中有消息变成了dead message即死信了,那么这个死信则会通过exchangeName=exchange.dlx.test, routingKey="queue.dlx.test"路由到死信队列%DLX%queue.dlx.test中,如果要消费这个dead message, 此时消费者必须消费%DLX%queue.dlx.test中的内容而不是queue.dlx.test中的内容。

如果不指定x-dead-letter-routing-key参数,则使用原来的routingkey

欢迎跳转到本文的原文链接:https://honeypps.com/mq/rabbitmq-analysis-of-dlx/


参考资料

  1. RabbitMQ之TTL(Time-To-Live 过期时间)
  2. RabbitMQ之mandatory和immediate
  3. RabbitMQ(四)RabbitMQ死信邮箱(DLX)
  4. RabbitMQ Dead Letter Exchanges

欢迎支持笔者新作:《深入理解Kafka:核心设计与实践原理》和《RabbitMQ实战指南》,同时欢迎关注笔者的微信公众号:朱小厮的博客。
在这里插入图片描述

  • 8
    点赞
  • 13
    评论
  • 18
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
<div> <span style="font-size:16px;"><span><span style="font-size:20px;color:#FF0000;"><strong><span>课程亮点:</span></strong></span></span></span> </div> <div style="font-size:16px;"> <span style="color:#424242;"><span style="background-color:#FFFAA5;">课程培训详细的笔记以及实例代码,让学员开始掌握RabbitMQ知识点</span></span> </div> <p style="font-size:16px;"> <span style="font-size:14px;"><span><span style="background-color:#FFFFFF;"><span style="color:#424242;"><br /> </span></span></span></span> </p> <p> <br /> </p> <p> <span style="font-size:16px;"><span><strong><span style="background-color:#FFFFFF;">课程内容:</span></strong></span></span> </p> <p> <span style="font-size:16px;color:#E53333;"><strong> </strong></span><span style="font-size:16px;color:#E53333;"><strong>第4章:RabbitMQ高级进阶:备胎交换器、过期队列死信队列、RPC调用、生产者确认机制、事务机制、消费者确认机制</strong></span> </p> <p> <span style="font-size:16px;color:#E53333;"><strong><br /> </strong></span> </p> <div style="font-size:16px;"> <span style="color:#FF0000;"><strong><span style="font-size:18px;">课程特色:</span></strong></span> </div> <div> <ol> <li> 笔记RabbitMQ中间件 :用200多条笔记串连所有知识点,让学员从一点一滴积累,学习过程无压力 </li> <li> 笔记标题采用关键字标识法,帮助学员更加容易记住知识点 </li> <li> 笔记以超链接形式让知识点关联起来,形式知识体系 </li> <li> 采用先概念后实例再应用方式,知识点深入浅出 </li> <li> <strong>提供授课内容笔记作为课后复习以及工作备查工具</strong> </li> </ol> </div> <div> <span style="font-size:16px;"><span><span style="color:#00B050;"><strong><strong><span style="font-size:18px;">部分图表(电脑PC端查看):</span></strong></strong></span></span></span> </div> <img src="https://img-bss.csdn.net/201905251315114717.png" alt="" /><img src="https://img-bss.csdn.net/201905251315176012.png" alt="" /><img src="https://img-bss.csdn.net/201905251315232244.png" alt="" /><img src="https://img-bss.csdn.net/201905251315281950.png" alt="" /><img src="https://img-bss.csdn.net/201905251315345328.png" alt="" /><img src="https://img-bss.csdn.net/201905251315393037.png" alt="" /><img src="https://img-bss.csdn.net/201905251315447756.png" alt="" /><br />
<p> <span style="font-size:18px;"><img src="https://img-bss.csdn.net/202002191047226381.jpg" alt="" /><br /> </span> </p> <p> <span style="font-size:18px;"><br /> </span> </p> <p> <span style="font-size:18px;">【课程介绍】</span> </p> <span style="font-size:18px;">     课程目标:</span><br /> <span style="font-size:18px;">             - 深入理解RabbitMQ发送消息的模式</span><br /> <span style="font-size:18px;">             - 熟练使用RabbitMQ五种消息模型</span><br /> <span style="font-size:18px;">             - 如何确定RabbitMQ的消息是否发送成功</span><br /> <span style="font-size:18px;">             - 如何确定RabbitMQ发送的消息是否消费成功。</span><br /> <span style="font-size:18px;">             - 项目实战中如何使用RabbitMQ,以及RabbitMQ的作用</span><br /> <br /> <span style="font-size:18px;">    消息队列是典型的:生产者、消费者模型。生产者不断向消息队列中生产消息,消费者不断的从队列中获取消息。因为消息的生产和消费都是异步的,而且只关心消息的发送和接收,没有业务逻辑的侵入,这样就实现了生产者和消费者的解耦。</span><br /> <br /> <span style="font-size:18px;">结合前面所说的问题:</span><br /> <br /> <span style="font-size:18px;">- 商品服务对商品增删改以后,无需去操作索引库或静态页面,只是发送一条消息,也不关心消息被谁接收。</span><br /> <span style="font-size:18px;">- 搜索服务和静态页面服务接收消息,分别去处理索引库和静态页面。</span><br /> <br /> <span style="font-size:18px;">如果以后有其它系统也依赖商品服务的数据,同样监听消息即可,商品服务无需任何代码修改。</span><br /> <span style="font-size:18px;"></span>
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值