SpringCloudStream学习(四)TTL(存活时间)Dead Letter Exchanges(死信交换机)

简介: SpringCloudStream学习(四)TTL(存活时间)Dead Letter Exchanges(死信交换机)

TTL(Time-To-Live and Expiration):


RabbitMQ既能对队列设置TTL也能对消息设置TTL,消息TTL可以应用于单个队列、一组队列或应用于逐个消息。

如何给消息设置TTL?

rabbitmqctl

rabbitmqctl set_policy TTL ".*" '{"message-ttl":60000}' --apply-to queues

rabbitmqctl (Windows)

rabbitmqctl set_policy TTL ".*" "{""message-ttl"":60000}" --apply-to queues

或者

byte[] messageBodyBytes = "Hello, world!".getBytes();
AMQP.BasicProperties properties = new AMQP.BasicProperties.Builder()
                                   .expiration("60000")
                                   .build();
channel.basicPublish("my-exchange", "routing-key", properties, messageBodyBytes);

如何给队列设置TTL?

rabbitmqctl

rabbitmqctl set_policy expiry ".*" '{"expires":1800000}' --apply-to queues

rabbitmqctl (Windows)

rabbitmqctl.bat set_policy expiry ".*" "{""expires"":1800000}" --apply-to queues

或者

Map<String, Object> args = new HashMap<String, Object>();
args.put("x-message-ttl", 60000);
channel.queueDeclare("myqueue", false, false, false, args);

死信队列:跟死信交换机绑定的队列


死信交换机:

当以下的任意情况发生的时候,意味着队列中的该消息变成了死信


  1. 消费者调用了basic.reject/basic.nack 并且设置requeue为false(不重回队列)的时候,消息就会进入死信队列 。
  2. 消息有效期过期。
  3. 队列达到最大的长度,并且我们没有设置自动拒绝消息的时候,队首的消息就会进入死信队列 。

死信交换机其实就是一个正常的交换机,我们可以像申明一个正常交换机一样申明它。


怎么给队列申明死信交换机?

rabbitmqctl

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

rabbitmqctl (Windows)

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

或者:

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);

我们也可以给这个交换机申明routingKey:

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

利用TTL跟死信交换机我们可以实现消息的延时处理:

大致思路如下:

1.声明一个延时处理的队列其实就是在申明队列的时候指定消息的存活时间,伪代码如下:

map.put("x-message-ttl", delayTime);

2.在申明这个队列时,同时指定死信交换机跟RoutingKey

 map.put("x-dead-letter-exchange", "dead-exchange");
 map.put("x-dead-letter-routing-key", "dead");
 queueDeclare("delay-queue", true, false, false, map)

3.申明一个队列跟死信交换机绑定,作为死信队列

queueDeclare("dead-queue", true, false, false, null)
queueBind("dead-queue", "dead-exchange", "dead", null)


/

相关实践学习
消息队列RocketMQ版:基础消息收发功能体验
本实验场景介绍消息队列RocketMQ版的基础消息收发功能,涵盖实例创建、Topic、Group资源创建以及消息收发体验等基础功能模块。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
相关文章
|
6月前
|
算法 网络协议 Linux
【Cisco Packet Tracer】交换机的自学习算法
【Cisco Packet Tracer】交换机的自学习算法
209 0
|
6月前
|
消息中间件 JSON 缓存
RabbitMQ快速学习之WorkQueues模型、三种交换机、消息转换器(SpringBoot整合)
RabbitMQ快速学习之WorkQueues模型、三种交换机、消息转换器(SpringBoot整合)
164 0
|
1月前
|
存储 安全 网络性能优化
交换机学习以及介绍
【10月更文挑战第1天】
36 3
|
3月前
|
网络协议
交换机ARP学习异常,看网工大佬是如何处理的?
交换机ARP学习异常,看网工大佬是如何处理的?
|
2月前
|
消息中间件 存储
RabbitMQ-死信交换机和死信队列
死信队列和死信交换机是RabbitMQ提供的一个非常实用的功能,通过合理使用这一机制,可以大大增强系统的健壮性和可靠性。它们不仅能有效解决消息处理失败的情况,还能为系统的错误追踪、消息延迟处理等提供支持。在设计系统的消息体系时,合理规划和使用死信队列和死信交换机,将会为系统的稳定运行提供一个有力的
58 0
|
6月前
|
算法 网络协议
【计网·湖科大·思科】实验三 总线型以太网的特性、集线器和交换机的区别、交换机的自学习算法
【计网·湖科大·思科】实验三 总线型以太网的特性、集线器和交换机的区别、交换机的自学习算法
202 1
|
6月前
|
存储 监控 安全
|
6月前
|
消息中间件 微服务
RabbitMQ入门指南(十):延迟消息-死信交换机
RabbitMQ是一个高效、可靠的开源消息队列系统,广泛用于软件开发、数据传输、微服务等领域。本文主要介绍了死信交换机、死信交换机实现延迟消息等内容。
182 0
|
6月前
|
存储 缓存 网络协议
计算机网络:思科实验【3-集线器与交换机的区别、交换机的自学习算法】
计算机网络:思科实验【3-集线器与交换机的区别、交换机的自学习算法】