什么是死信

在 RabbitMQ 中充当主角的就是消息,在不同场景下,消息会有不同地表现。
死信就是消息在特定场景下的一种表现形式,这些场景包括:

  • 消息被拒绝访问,即 RabbitMQ返回 nack 的信号时
  • 消息的 TTL 过期时
  • 消息队列达到最大长度
  • 消息不能入队时。

上述场景经常产生死信,即消息在这些场景中时,被称为死信。

什么是死信队列

死信队列就是用于储存死信的消息队列,在死信队列中,有且只有死信构成,不会存在其余类型的消息。

死信队列在 RabbitMQ 中并不会单独存在,往往死信队列都会绑定这一个普通的消息队列,当所绑定的消息队列中,有消息变成死信了,那么这个消息就会重新被交换机路由到指定的死信队列中去,我们可以通过对这个死信队列进行监听,从而手动的去对这一消息进行补偿。

那么,我们到底如何来使用死信队列呢?

死信队列基本使用

在 RabbitMQ 中,死信队列的标识为 x-dead-letter-exchange ,通过观察死信队列的标识,我们不难发现,其标识最后为 exchange ,即 RabbitMQ 中的交换机,RabbitMQ 中的死信队列就是由死信交换机而得出的。

要想使用死信队列,我们需要首先声明一个普通的消息队列,并将死信队列的标识绑定到这个普通的消息队列上, 这个过程需要我们在生产端进行配置,代码如下所示:

// 使用 ConnectionFactory 创建了一个客户端连接 RabbitMQ Server 的连接。
ConnectionFactory connectionFactory = new ConnectionFactory();
connectionFactory.setHost("xx");
connectionFactory.setPort("5672");
connectionFactory.setVirtualHost("/");
Connection connection = connectionFactory.newConnection();// 使用建立好的连接,来创建了一个频道 channel 。
Channel channel = connection.createChanel();// 声明了一个普通队列的额外参数的 Map ,
// 这个 Map 的 key 就是死信队列的标识,value 就是我们后续声明的真正的死信交换机的名称。
Map<String, Object> argumentsMap = new HashMap();
argumentsMap.put("x-dead-letter-exchange", "dlx_exchange");/*
使用 channel 的 exchangeDeclare 方法和 queueDeclare 方法,
分别声明了一个名为 dlx_common_exchange 的交换机和名为 dlx_common_queue 的普通消息队列,
之所以名称中有 common ,是因为要对这个交换机和队列做一个标识,表示该交换机和队列是绑定了死信队列的。
*/
channel.exchangeDeclare("dlx_common_exchange", "direct", true, false, null);
channel.queueDeclare("dlx_common_queue", true, false, false, argumentsMap);/*
使用 channel 的 queueBind 方法来讲声明的普通交换机和消息队列进行绑定,并且制定了 routingKey ,
这样消息就可以经 dlx_common_exchange 根据 routingKey 来路由到 dlx_common_queue 中。
*/
channel.queueBind("dlx_common_queue", "dlx_common_exchange", routingKey);

声明了要绑定死信队列的普通队列之后,最后我们需要声明真正的死信队列

// 使用 chanel 的 exchangeDeclare 方法来声明了一个名为 dlx_exchange 的交换机。
channel.exchangeDeclare("dlx_exchange", "direct", true, false, null);
// 使用 channel 的 queueDeclare 方法来声明了一个名为 dlx_queue 的队列。
channel.queueDeclare("dlx_queue", true, false, false, null);
// 使用 channel 的 queueBind 方法,来将 dlx_exchange 的交换机与 dlx_queue 队列进行了绑定。
channel.queueBind("dlx_queue", "dlx_exchange", routingKey);

MQ处理消息失败了怎么办

在生产环境中,使用MQ的时候设计两个队列:

  • 一个是业务队列,专门用来处理消息;
  • 一个是死信队列。用来处理异常情况。

比如说消费消息的时候,数据库故障了,此时无法将数据落盘,那么消费者每次消费一条消息,尝试落盘持久化的时候,都会遇到数据库报错。此时消费者就可以把这条消息拒绝访问,或者标志位处理失败!

  • 一旦标志这条消息处理失败了之后,MQ就会把这条消息转入提前设置好的一个死信队列中。
  • 在数据库故障期间,所有消息全部处理失败,全部会转入死信队列。
  • 然后消费者会专门有一个后台线程,监控数据库是否正常,能否请求的,不停的监视。
  • 一旦发现对方恢复正常,这个后台线程就从死信队列消费出来处理失败的订单,重新处理逻辑
  • 死信队列的使用,其实就是MQ在生产实践中非常重要的一环,也就是架构设计必须要考虑的。

RabbitMQ的死信队列相关推荐

  1. RabbitMq(五) -- 死信队列和延迟队列

    1. 死信 1.1 死信的概念 先从概念解释上搞清楚这个定义,死信,顾名思义就是无法被消费的消息,字面意思可以这样理解,一般来说,producer 将消息投递到 broker 或者直接到 queue ...

  2. RabbitMQ:死信队列

    ✨ RabbitMQ:死信队列 1.死信队列 1.1死信队列基本介绍 1.2消息成为死信的三种情况 1.3死信队列结构图 1.4死信的处理方式 2.TTL消息过期时间 2.1基本介绍 2.2生产者 2 ...

  3. rabbitMQ学习-死信队列

    死信队列 死信:顾名思义就是无法被消费的消息,一般情况下,product将消息投递到broker或者直接到queue里,consumer从queue取出消息,进行消费,但某些时候由于特定的原因导致qu ...

  4. RabbitMQ 之死信队列

    文章目录 什么是死信队列 如何配置死信队列 死信消息的变化 死信队列应用场景 总结 什么是死信队列 为了保证订单业务的消息数据不丢失,需要使用到RabbitMQ的死信队列机制,当消息消费发生异常时,将 ...

  5. rabbitmq利用死信队列+TTL 实现延迟队列

    2019独角兽企业重金招聘Python工程师标准>>> 适用场景:订单超时未支付,倘若适用定时器的话,那么数据量大的话,轮询查询数据,首先IO开销大,其次任务时间要求高,扫描越频繁性 ...

  6. RabbitMQ的死信队列的应用

    强烈推荐一个大神的人工智能的教程:http://www.captainbed.net/zhanghan [前言] 最近在项目中用到了RabbitMQ来做异步处理,自己将这块儿系统的搞了搞,下面主要记录 ...

  7. 消息中间件之rabbitMQ实战-死信队列

    该篇文章内容较多,包括有rabbitMq相关的一些简单理论介绍,集成spring Boot,provider消息推送实例,consumer消息消费实例,Direct(直连类型交换机).Fanout(广 ...

  8. RabbitMQ实现死信队列

    目录 死信队列是什么 怎样实现一个死信队列 说明 实现过程 导入依赖 添加配置 编写mq配置类 添加业务队列的消费者 添加死信队列的消费者 添加消息发送者 添加消息测试类 测试 死信队列的应用场景 总 ...

  9. RabbitMQ高级特性(五):RabbitMQ之死信队列DLX

    一.死信队列简介 (1)死信队列 死信队列,英文缩写:DLX .Dead Letter Exchange(死信交换机),当消息成为Dead message后,可以被重新发送到另一个交换机,这个交换机就 ...

最新文章

  1. 关于素数的简单算法整理
  2. [Java面试五]Spring总结以及在面试中的一些问题.
  3. Jeff Dean:我们写了一份「稀疏模型设计指南」,请查收
  4. bellmanford队列优化
  5. Linux /proc目录详解
  6. 学习笔记——web安全深度剖析
  7. C语言——实现简单的猜数字游戏
  8. 使用Cdn加速静态资源
  9. 抓取微信小程序页面丶小程序源码
  10. 129、易燃气体的分级
  11. AurixDevStudio集成MCAL
  12. 带特殊符号|的字符串的截取
  13. pn532写入手机nfc_NFC的PN532 读写命令格式
  14. Smart Contract Vulnerabilities:Vulnerable Does Not Imply Exploited总结
  15. Kettle 使用资源库功能把ktr元数据统一存储到数据库中
  16. 固定值的字段该不该建立索引
  17. 第一节 Minio保护数据免受硬件故障和无声数据损坏的纠删码Erasure-Code
  18. Chrome插件MV3简单开发
  19. WebGIS全栈修炼之路1——开篇一起梳理一下修炼之路
  20. Ethereal 使用手册

热门文章

  1. unity 渲染性能分析工具
  2. 学霸君面试php,我是如何通过学霸君面试的?
  3. VS2010旗舰版下载----带SN系列号
  4. 浅谈大学生就业中的自我定位
  5. 记录基于STM32的独轮车测试板构建(一)电机篇
  6. Python真的很慢?那又如何!在实践中告诉你真相!
  7. 大学美术报计算机一级,美术报
  8. 我买了个华为二手手机我给强制恢复出厂设置了,结果手机被锁定了,现在激活设备激活不了,需要账号的密码的怎么办解决方法教程
  9. JAVA-JVM的钩子函数
  10. LeetCode:206(Python)—— 反转链表(简单)