一、概述

死信有死信队列、死信交换器和死信消息组成。死信消息则有如下三种情况生成:

1.消费者使用basic.reject或 basic.nack并将requeue参数设置为false来拒绝该消息

2.消息设置了TTL过期时间,过期时间内没有消费导致过期

3.消息因超过队列长度导致被丢弃

如果队列删除或者队列的TTL过期时间到了被删除其中的消息是不会成为死信消息的。

每个队列可通过队列参数arg或者策略policy设置死信交换器和死信路由键来处理死信消息,当队列参数与策略都有设置时,以队列参数设置内容为准,建议使用策略。没有设置死信,消息满足死信条件将会被丢弃。

简而言之,一个队列A设置了死信交换器和路由键,当一个消息满足死信要求时会通过设置的死信交换器和路由键找到对应的队列将消息传递到对应队列B中,B也就是对应的死信队列。所以,死信交换机和死信队列都是正常的交换器和队列,和其他的交换器队列声明没区别。通过死信队列可以防止消息的意外丢失,保证重要的消息被执行记录。

二、在策略中设置死信

我们通过rabbitmqctl命令创建一个名为DLX的设置了死信交换器为my-dlx路由键为my-dlx-routekey的策略,对应用于所有的队列。

 rabbitmqctl set_policy --vhost my_vhost1 DLX ".*" '{"dead-letter-exchange":"my-dlx","dead-letter-routing-key":"my-dlx-routekey"}' --apply-to queues

或者在web管理页中添加policy如下:

有多个策略的话使用优先级最高的策略,设置后队列会有个DLX的特性。

三、在队列参数中设置死信

我们通过队列参数设置x-dead-letter-exchange和x-dead-letter-routing-key,死信交换器必须和队列处于同一个vhost下,示例代码如下:

Dictionary<string, object> arg = new Dictionary<string, object>();
arg.Add("x-dead-letter-exchange","hello-dlx");
arg.Add("x-dead-letter-routing-key", "hello-dlx-routekey");
channel.QueueDeclare(
  "HelloQueue",//队列名称
  false, //是否持久化
  false, //是否只对首次声明的队列可见
  false, //是否自动删除
  arg ////关于队列和队列内消息的详细设置,键值对形式
);

四、死信路由

我们在上述代码中都设置了死信路由键,但是其实是可以不设置的,如果设置了就遵循设置的路由键,如果没有设置则遵循原交换器的路由键。比如:我们将消息发送到路由键为A的交换器进入队列,则当消息死信时也发送到路由键为A的死信交换器,如果设置了x-dead-letter-routing-key为B则发送到路由键为B的死信交换器中。如果不设置死信路由键,那么由CC和BCC设置的路由键也会触发,CC和BCC相当于抄送和密送到别的交换器。

如果产生死信循环,既到达同一个队列两次,消息将会被抛弃。当死信消息发送到死信队列后将会从原队列删除,避免过多消息的积压,但是如果目标的死信队列不能接受消息,则该死信消息将可能丢失。

五、死信消息

当死信消息被发送到死信队列后会有以下变化:

1.消息的交换器名称会改为死信交换器名称;

2.设置了死信路由键的话,路由键会相应更改;

3.CC和BCC标头将会删除;

死信消息将会添加一些标头,我们先看下打印的标头:

{"Headers":{
"x-death":[
{
"count":1,
"reason":"ZXhwaXJlZA==",
"queue":"SGVsbG9RdWV1ZQ==",
"time":{
"UnixTime":1637409202
},
"exchange":"SGVsbG9FeGNoYW5nZQ==",
"routing-keys":[
"aG9sYQ=="
]
}
],
"x-first-death-exchange":"SGVsbG9FeGNoYW5nZQ==",
"x-first-death-queue":"SGVsbG9RdWV1ZQ==",
"x-first-death-reason":"ZXhwaXJlZA=="
}
}

可以看到值是Base64格式的,新添加了x-death、x-first-death-exchange、x-first-death-queue、x-first-death-reason四个值。

x-first-death-exchange:第一次的成为死信时的交换器名称;

x-first-death-queue:第一次的成为死信时的队列名称;

x-first-death-reason:第一次的成为死信时的原因,死亡原因分为四种下同分别是:rejected(消息处理被拒绝)、expired (ttl时间到期)、maxlen(超过队列允许最大长度)和Delivery-limit(消息返回的次数超限额)

这三个是第一次死信的时候添加的,后面就不会变了。

x-death里面是数组形式的,因为消息可能多次死信。新条目被添加到x-death 数组的开头。如果x-death已经包含一个具有相同队列和死字原因的条目,它的计数字段count将增加,并将移到数组的开头。

queue:消息在死信之前所在队列的名称;

reason:死信的原因,同上;

time:消息被死信的日期和时间,为 64 位 AMQP 0-9-1 时间戳;

exchange :消息发布到的交换器名(请注意,如果消息多次死信,这将是死信交换);

routing-keys :消息发布时使用的路由键(包括CC密钥,但不包括BCC密钥 );

count : 由于这个原因,这条消息在这个队列中被死信多少次;

original-expiration(如果消息由于消息的TTL死信的):消息的原始到期属性。该到期属性从死刻字的消息,以防止它被路由到任何队列再次到期删除。

学习链接:https://www.rabbitmq.com/dlx.html

Rabbitmq的死信的更多相关文章

  1. RabbitMQ实战-死信队列

    RabbitMQ死信队列 场景说明 代码实现 简单的Util 生产者 消费者 场景说明 场景: 当队列的消息未正常被消费时,如何解决? 消息被拒绝并且不再重新投递 消息超过有效期 队列超载 方案: 未 ...

  2. RabbitMQ配置死信队列

    死信队列 消息传输过程中难免会产生一些无法及时处理的消息,这些暂时无法处理的消息有时候也是需要被保留下来的,于是这些无法被及时处理的消息就变成了死信. 既然需要保留这些死信,那么就需要一个容器来存储它 ...

  3. RabbitMQ之死信队列

    1:何为死信队列 死信队列也是一个正常的队列,可以被消费. 但是,死信队列的消息来源于其他队列的转发. 2:如何触发死信队列 1:消息超时 2:队列长度达到极限 3:消息被拒绝消费,并不再重进队列,且 ...

  4. RabbitMQ死信队列另类用法之复合死信

    前言 在业务开发过程中,我们常常需要做一些定时任务,这些任务一般用来做监控或者清理任务,比如在订单的业务场景中,用户在创建订单后一段时间内,没有完成支付,系统将自动取消该订单,并将库存返回到商品中,又 ...

  5. 【RabbitMQ】一文带你搞定RabbitMQ死信队列

    本文口味:爆炒鱿鱼   预计阅读:15分钟 一.说明 RabbitMQ是流行的开源消息队列系统,使用erlang语言开发,由于其社区活跃度高,维护更新较快,性能稳定,深得很多企业的欢心(当然,也包括我 ...

  6. RabbitMQ 参数们的Power “续”

    参数中的 arguments 之前讲参数的一些作用的时候,忽略了最后一个字典类型的参数,因为这个参数是大有文章的,值得单独进出来说道说道. 这时,就不得不打开我们的 Web UI管理系统了,可以看到在 ...

  7. 【RabbitMQ】2、心得总结,资料汇总

    Spring AMQP中文文档 http://ju.outofmemory.cn/entry/320538 云栖社区    https://yq.aliyun.com/search?q=rabbitm ...

  8. 关于RabbitMQ Queue Argument的简介

    1.Message TTL message在队列queue中可以存活多长时间,以毫秒为单位:发布的消息在queue时间超过了你设定的时间就会被删除掉. channel.queueDeclare(&qu ...

  9. RabbitMQ 参数们的Power “续”

      参数中的 arguments 之前讲参数的一些作用的时候,忽略了最后一个字典类型的参数,因为这个参数是大有文章的,值得单独进出来说道说道. 这时,就不得不打开我们的 Web UI管理系统了,可以看 ...

随机推荐

  1. HTML常用的css属性(及其简写)

    这篇文章主要介绍几个常用css属性和简写 本文目录: 1.背景属性 2.边框属性 3.字体属性 4.外边距 5.填充 6.颜色 1.background[背景属性] background-color ...

  2. == 和 equals区别

    == equals是两种字符串的方式 区别 == 是比较两个对象的引用地址值 equals是比较两个对象的具体内容 示例 package com.oop.demo06; public class De ...

  3. Python异常代码含义对照表

    Python常见的异常提示及含义对照表如下: 异常名称 描述 BaseException 所有异常的基类 SystemExit 解释器请求退出 KeyboardInterrupt 用户中断执行(通常是 ...

  4. 题解 「ZJOI2018」历史

    题目传送门 Description 九条可怜是一个热爱阅读的女孩子. 这段时间,她看了一本非常有趣的小说,这本小说的架空世界引起了她的兴趣. 这个世界有 \(n\) 个城市,这 \(n\) 个城市被恰 ...

  5. 洛谷4234最小差值生成树 (LCT维护生成树)

    这也是一道LCT维护生成树的题. 那么我们还是按照套路,先对边进行排序,然后顺次加入. 不过和别的题有所不同的是: 在本题中,我们需要保证LCT中正好有\(n-1\)条边的时候,才能更新\(ans\) ...

  6. bzoj4094 && luogu3097 最优挤奶

    题目大意: 给定n个点排成一排,每个点有一个点权,有m次修改,每次改变某个点的点权并将最大点独立集计入答案,输出最终的答案 其中\(n\le 40000\ , \ m\le 50000\) QWQ说实 ...

  7. 2021.7.27--Benelux Algorithm Programming Contest 2020 补提

    I Jigsaw 题目内容: 链接:https://ac.nowcoder.com/acm/contest/18454/I 来源:牛客网 You have found an old jigsaw pu ...

  8. 2021.5.22 vj补题

    A - Marks CodeForces - 152A 题意:给出一个学生人数n,每个学生的m个学科成绩(成绩从1到9)没有空格排列给出.在每科中都有成绩最好的人或者并列,求出最好成绩的人数 思路:求 ...

  9. TStor-OneCOS ,主打专一海量对象场景

    ​谁能与你厮守终身 生活在21世纪,最常见的事莫过于更新换代了,找一款能长久适用的产品,是很多人都希望拥有的,特别是针对于云服务产品,而对象·混合云存储新增 TStor-OneCOS 就是这样一款可以 ...

  10. pycharm 服务器连接及一些问题解决

    主要介绍一下如何使用pycharm连接服务器并在服务器上炼丹,并对遇到的一个小问题进行说明. 目录 1,SSH连接 2,linux常用命令 3,配置anaconda 4,运行代码 5,一个常见错误 1 ...