rabbitMq 学习笔记(二) 备份交换器,过期时间,死信队列,死信队列
备份交换器
备份交换器,英文名称为 Altemate Exchange,简称庙,或者更直白地称之为"备胎交换器"。 生产者在发送消息的时候如果不设置 mandatory 参数, 那么消息在未被路由的情况下将会丢失: 如果设置了 mandatory 参数,那么需要添加 ReturnListener 的编程逻辑,生产者的代码将变得复杂。如果既不想复杂化生产者的编程逻辑,又不想消息丢失,那么可以使用备份交换器, 这样可以将未被路由的消息存储在 RabbitMQ 中,再在需要的时候去处理这些消息。
代码如下:
channel.ExchangeDeclare("myAe", "fanout", true, false, null); //声明备份交换器
Dictionary<string, object> arg = new Dictionary<string, object>();
arg.Add("a1ternate-exchange", "myAe");
channel.ExchangeDeclare("ExchangeName", "direct", true, false, arg); //声明交换器与备份交换器绑定
channel.QueueDeclare("QueueName", true, false, false, null);
channel.QueueDeclare("QueueAe", true, false, false, null); //备份队列
channel.QueueBind("QueueName", "ExchangeName", "RoutingKey", null);
channel.QueueBind("QueueAe", "myAe", "");
channel.BasicPublish("ExchangeName", "RoutingKey",null, Encoding.UTF8.GetBytes("helloword"));
当消息的 RoutingKey 不是 “RoutingKey”时,消息将不能被正确路由到“ExchangeName”上的队列,此时就会发送给 myAe 交换器,进而发送到 QueueAe这个队列 。
考虑到备份交换器的作用,建议将交换器类型设置为fanout,因为消息被重新发送到 备份交换器时的路由键和从生产者发出的路由键是一样的。
过期时间(TTL)
RabbitMQ 可以对"消息"和"队列"设置 TTL。
目前有两种方法可以设置消息的 TTL。第一种方法是通过队列属性设置,队列中所有消息都有相同的过期时间。第二种方法是对消息本身进行单独设置,每条消息的TTL可以不同。如果两种方法一起使用,则消息的 TTL 以两者之间较小的那个数值为准。消息在队列中的生存时间一旦超过设置的 TTL 值时,就会变成"死信" (Dead Message),消费者将无法再收到该消息。
channel.ExchangeDeclare("ExchangeName", "direct", true, false, null); //声明交换器与备份交换器绑定
Dictionary<string, object> arg = new Dictionary<string, object>();
arg.Add("x-message-ttl", ); //设置队列过期时间 5000ms
channel.QueueDeclare("QueueName", true, false, false, arg);
channel.QueueBind("QueueName", "ExchangeName", "RoutingKey", null);
var basicProperties = channel.CreateBasicProperties();
basicProperties.Expiration = ""; //设置消息过期时间 4000ms
channel.BasicPublish("ExchangeName", "RoutingKey", basicProperties, Encoding.UTF8.GetBytes("helloword"));
对于第一种设置队列 TTL 属性的方法,一旦消息过期,就会从队列中抹去,而在第二种方 法中,即使消息过期,也不会马上从队列中抹去,因为每条消息是否过期是在即将投递到消费者之前判定的。
死信队列
DLX,全称为 Dead-Letter-Exchange,可以称之为死信交换器,也有人称之为死信邮箱。当消息在一个队列中变成死信 (dead message) 之后,它能被重新被发送到另一个交换器中,这个交换器就是 DLX,绑定 DLX 的队列就称之为死信队列。
消息变成死信一般是由于以下几种情况:
- 消息被拒绝 (Basic.Reject/Basic .Nack),井且设置 requeue 参数为 false;
- 消息过期;
- 队列达到最大长度。
DLX 也是一个正常的交换器,和一般的交换器没有区别,它能在任何的队列上被指定, 实 际上就是设置某个队列的属性。当这个队列中存在死信时 , RabbitMQ 就会自动地将这个消息重新发布到设置的 DLX 上去,进而被路由到另一个队列,即死信队列。可以监听这个队列中的消息,以进行相应的处理。
channel.ExchangeDeclare("exchange.dlx", "direct", true); //声明DLX
channel.ExchangeDeclare("ExchangeName", "direct", true); //声明交换器与备份交换器绑定
Dictionary<string, object> arg = new Dictionary<string, object>();
arg.Add("x-dead-letter-exchange", "exchange.dlx"); //设置DLX
arg.Add("x-dead-letter-routing-key", "routingkey"); //为私信消息重设路由键
channel.QueueDeclare("QueueName", true, false, false, arg);
channel.QueueDeclare("DlQueue",true,false,false);
channel.QueueBind("QueueName", "ExchangeName", "RoutingKey", null);
channel.QueueBind("DlQueue", "exchange.dlx", "routingkey");
var basicProperties = channel.CreateBasicProperties();
basicProperties.Expiration = ""; //设置消息过期时间 4000ms
channel.BasicPublish("ExchangeName", "RoutingKey", basicProperties, Encoding.UTF8.GetBytes("helloword"));
如果4s内消息没有被消费者消费,那么判定这条消息为过期,消息就会被丢给exchange.dlx,进而转发给DlQueue。
死信队列
延迟队列存储的对象是对应的延迟消息,所谓"延迟消息"是指当消息被发送以后,并不想让消费者立刻拿到消息,而是等待特定时间后,消费者才能拿到这个消息进行消费。
延迟队列可以通过设置消息的ttl和死信队列来实现,消费者订阅死信队列达到延迟效果。
过期时间(TTL)
rabbitMq 学习笔记(二) 备份交换器,过期时间,死信队列,死信队列的更多相关文章
- Redis学习笔记(十)——过期时间、访问限制与缓存
http://irfen.me/redis-learn-10-time-expire-limit-cache/ 过期时间 之前应该提到过 redis 的特性之一是可以设置键的超时时间.命令是expir ...
- .NET之RabbitMQ学习笔记(二)-安装
安装 1.安装erlang语言环境 因为rabbitmq是基于erlang进行开发,所以需要安装相应的依赖环境,学习中用到的erlang包下载地址:http://www.erlang.org/down ...
- rabbitMQ学习笔记(二) 简单的发送与接收消息 HelloWorld
首先要下载rabbitmq的javaClient库,然后加入到项目中,下载地址为:http://www.rabbitmq.com/releases/rabbitmq-java-client/v3.1. ...
- RabbitMQ学习笔记二:Java实现RabbitMQ
本地安装好RabbitMQ Server后,就可以在Java语言中使用RabbitMQ了. RabbitMQ是一个消息代理,从"生产者"接收消息并传递消息至"消费者&qu ...
- 官网英文版学习——RabbitMQ学习笔记(十)RabbitMQ集群
在第二节我们进行了RabbitMQ的安装,现在我们就RabbitMQ进行集群的搭建进行学习,参考官网地址是:http://www.rabbitmq.com/clustering.html 首先我们来看 ...
- kvm虚拟化学习笔记(二)之linux kvm虚拟机安装
KVM虚拟化学习笔记系列文章列表----------------------------------------kvm虚拟化学习笔记(一)之kvm虚拟化环境安装http://koumm.blog.51 ...
- RabbitMQ学习笔记(四、RabbitMQ队列)
目录: 消息路由失败了会怎样 备份交换器 TTL与DLX 如何实现延迟队列 RabbitMQ的RPC实现 持久化 事务 发送方确认机制 消息路由失败了会怎样: 在RabbitMQ中,如果消息路由失败了 ...
- 官网英文版学习——RabbitMQ学习笔记(一)认识RabbitMQ
鉴于目前中文的RabbitMQ教程很缺,本博主虽然买了一本rabbitMQ的书,遗憾的是该书的代码用的不是java语言,看起来也有些不爽,且网友们不同人学习所写不同,本博主看的有些地方不太理想,为此本 ...
- [Firefly引擎][学习笔记二][已完结]卡牌游戏开发模型的设计
源地址:http://bbs.9miao.com/thread-44603-1-1.html 在此补充一下Socket的验证机制:socket登陆验证.会采用session会话超时的机制做心跳接口验证 ...
随机推荐
- 如何使用Salt Pillar
作者言 Salt的网站上有两篇关于Pillar的文档(一,二),其中一篇内容很少,我觉得写成一篇文章更合适.本文的逻辑结构没有参照官方文档,而是根据我自己对Pillar的理解组织内容,希望能够把这个概 ...
- composer.json和composer.lock有什么区别?
我们在做项目的时候,总是要安装一些依赖.composer给我们提供了很多方便.直接运行composer install. 当我们运行composer install 将会读取composer.lo ...
- java 异步操作
/** * 异步删除 * * @param keys */ public void asycExecute(String keys) { ExecutorService executor = Exec ...
- linux 的 两种磁盘扩容
当LVM分区空间不足的时候,可以进行扩容.主要的扩容方法有两种: 通过空余的磁盘进行扩容,这个方法比较简单,不会对原有数据有影响.将其他LVM分区空间取出一部分给需要扩容的LVM分区.下面就分别具体介 ...
- Python执行时间的计算方法
# CPU的执行时间start = time.clock()#end = time.clock()print(end-start) # 程序执行时间:start = datetime.datetime ...
- golang rabbitmq 的学习
https://www.rabbitmq.com/tutorials/tutorial-one-go.html Rabbitmq的任务分发机制 producer_task.go package mai ...
- Windows10纯净原版系统安装方法
原文:https://baijiahao.baidu.com/s?id=1626696368732676440&wfr=spider&for=pc 1.先来下载一个纯净的ISO系统安装 ...
- ISO/IEC 9899:2011 条款5——环境
5.环境 1.一个实现在两个不同的数据处理系统环境下分别翻译C源文件与执行C程序,在本国际标准中分别称为翻译环境和执行环境.它们的特征定义并包含了根据顺从标准实现的语法及语义规则所构造的顺从标准的C程 ...
- HttpUtils(2)
import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.InputStreamReader; impo ...
- matlab学习笔记8 基本绘图命令-图形窗口简介
一起来学matlab-matlab学习笔记8 基本绘图命令_1 图形窗口简介 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考书籍 <matlab 程序设计与综合应用>张德丰等 ...