RabbitMQ实战指南之Time-To-Live and Expiration

简介: RabbitMQ实战指南之Time-To-Live and Expiration

1 概述

RabbitMQ允许你为messages和queues设置TTL(存活时间)。这可以使用可选的queue 参数或策略来完成(建议使用后一个选项)。

Message TTL可以应用于单个队列,一组队列或逐个消息地应用。

TTL设置也可以由操作策略强制执行。

队列中的 Per-Queue消息TTL

Message TTL可以通过使用策略设置message-ttl参数或通过在队列声明时指定相同的参数来为给定队列设置.


已在队列中的时间超过配置的TTL的消息被判定已死.

路由到多个队列的消息可能会在其所在的每个队列中的不同时间或根本不会消亡,一个队列中的消息死亡对其他队列中相同消息的生命没有影响.


服务器保证不会使用basic.deliver(发送给消费者)或者包含在basic.get-ok响应(对于一次性获取操作)中来传递死消息.

此外,服务器会尝试在基于TTL的到期时或之后不久删除消息.


描述TTL周期(以毫秒为单位)的TTL参数或策略的值必须是非负整数.因此,值1000意味着添加到队列的消息将在队列中存活1秒或直到它被传递给消费者.参数可以是AMQP 0-9-1类型short-short-int,short-int,long-int或long-long-int.


3 使用策略为队列定义消息TTL

要使用策略指定TTL,在Linux中,请将key “message-ttl”添加到策略定义中:

image.png

这对所有队列应用60秒的TTL.

4 在声明时使用 x-参数 为队列定义消息的TTL

以下示例创建一个消息最多可驻留60秒的队列:

image.png

可以将消息TTL策略应用于已经包含消息的队列,但这涉及一些警告.


如果消息被重新排队(例如,由于使用了具有重新排队参数的AMQP方法,或者由于通道关闭),则保留消息的原始到期时间.


将TTL设置为0会导致消息在到达队列时过期,除非它们可以立即传递给消费者.

因此,这提供了立即发布标志的替代方案,RabbitMQ服务器不支持该标志.

与那个标志不同,没有发布basic.returns,如果设置了死信交换,那么消息将被删除.

5 发布者中的 Per-Message TTL

通过在发送basic.publish时设置基本的AMQP 0-9-1类中的expiration字段,可以在每个消息的基础上指定TTL.


expiration字段的值描述TTL时间段(以毫秒为单位).适用与x-message-ttl相同的约束.

由于expiration字段必须是字符串,因此broker将(仅)接受该数字的字符串表示形式.


当指定了每个队列和每个消息的TTL时,将选择使用两者之间的较小值.


以下示例使用RabbitMQ Java客户端发布一条消息,该消息可以驻留在队列中最多60秒:


image.png

image.png

6 Caveats

具有针对每个消息TTL追溯应用的队列(当他们已经有消息时)将在特定事件发生时丢弃消息.

只有当过期的消息到达队列的头部时,它们才会被丢弃(或者被删除字母).消费者不会向他们发送过期消息.

消息到期和消费者传递之间可能存在自然竞争条件,例如:邮件在写入套接字之后但在到达使用者之前可能会过期。 设置每个消息的TTL过期消息可以在非过期消息之后排队,直到后者消耗或过期。因此,这些过期消息使用的资源将不会被释放,并且它们将被计入队列统计中(例如队列中的消息数)。 当追溯应用每消息TTL策略时,建议让消费者联机以确保更快地丢弃消息。 鉴于现有队列上每个消息TTL设置的这种行为,当需要删除消息以释放资源时,应该使用队列TTL(或队列清除或队列删除)。 Queue TTL TTL也可以在队列上设置,而不仅仅是队列内容。队列将在一段时间后过期,仅在不使用它们时(例如,没有消费者)。此功能可与自动删除队列属性一起使用。通过将x-expires参数设置为queue.declare,或者通过设置expires策略,可以为给定队列设置 Expiry time。这可以控制队列在自动删除之前可以使用多长时间。未使用意味着队列没有消费者,队列最近没有重新声明(重新声明续订租约),并且至少在有效期内没有调用basic.get。例如,这可以用于RPC样式的回复队列,其中可以创建许多可能永远不会被耗尽的队列。 服务器保证队列将被删除,如果至少在有效期内未使用。不保证在到期期限过后如何及时删除队列。服务器重新启动时,持久队列的租约会重新启动。 x-expires参数或expires策略的值描述了有效期(以毫秒为单位)。它必须是正整数(与消息TTL不同,它不能为0)。因此,值1000意味着将删除未使用1秒的队列。 使用策略为队列定义队列TTL以下策略使所有队列在上次使用后30分钟后到期: rabbitmqctl rabbitmqctl set_policy expiry“。”’{“expires”:1800000}’ - apply-to queues rabbitmqctl(Windows) rabbitmqctl.bat set_policy expiry“。”“{”“expires”“:1800000}” - apply-to queues 在声明期间使用x参数为队列定义队列TTL Java中的这个例子创建一个队列,该队列在未使用30分钟后到期。 Map String,Object args = new HashMap String,Object(); args.put(“x-expires”,1800000); channel.queueDeclare(“myqueue”,false,false,false,args); 获取帮助和提供反馈如果您对本指南的内容或与RabbitMQ相关的任何其他主题有疑问,请不要犹豫,在RabbitMQ邮件列表中询问他们。 帮助我们改进文档3 如果您想对网站做出改进,可以在GitHub上找到它的来源。只需分叉存储库并提交拉取请求。谢谢! 本节内容服务器文档客户端文档插件新闻协议我们的扩展确认消费者取消消费者预取消费者优先级直接回复被阻止的连接basic.nack e2e绑定备用交换发件人路由TTL死字母长度限制优先级队列验证用户ID验证失败规格差异构建以前的版本许可证


参考

RabbitMQ官网


相关实践学习
消息队列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
目录
相关文章
|
8月前
|
消息中间件 负载均衡 Java
【深入浅出RocketMQ原理及实战】「底层原理挖掘系列」透彻剖析贯穿RocketMQ的消息消费长轮训机制体系的原理分析
【深入浅出RocketMQ原理及实战】「底层原理挖掘系列」透彻剖析贯穿RocketMQ的消息消费长轮训机制体系的原理分析
112 0
|
8月前
|
消息中间件 Java RocketMQ
RocketMQ实战教程之RocketMQ安装
这是一篇关于RocketMQ安装的实战教程,主要介绍了在CentOS系统上使用传统安装和Docker两种方式安装RocketMQ。首先,系统需要是64位,并且已经安装了JDK 1.8。传统安装包括下载安装包,解压并启动NameServer和Broker。Docker安装则涉及安装docker和docker-compose,然后通过docker-compose.yaml文件配置并启动服务。教程还提供了启动命令和解决问题的提示。
|
8月前
|
消息中间件 前端开发 数据库
RocketMQ实战教程之MQ简介与应用场景
RocketMQ实战教程介绍了MQ的基本概念和应用场景。MQ(消息队列)是生产者和消费者模型,用于异步传输数据,实现系统解耦。消息中间件在生产者发送消息和消费者接收消息之间起到邮箱作用,简化通信。主要应用场景包括:1)应用解耦,如订单系统与库存系统的非直接交互;2)异步处理,如用户注册后的邮件和短信发送延迟处理,提高响应速度;3)流量削峰,如秒杀活动限制并发流量,防止系统崩溃。
|
3月前
|
消息中间件 数据采集 中间件
RabbitMQ的使用—实战
RabbitMQ的使用—实战
114 0
|
4月前
|
消息中间件 缓存 Java
RocketMQ的JAVA落地实战
RocketMQ作为一款高性能、高可靠、高实时、分布式特点的消息中间件,其核心作用主要体现在异步处理、削峰填谷以及系统解耦三个方面。
200 0
|
6月前
|
消息中间件 新零售 弹性计算
云消息队列 RabbitMQ 版入门训练营,解锁对比开源优势与零基础实战
欢迎加入「云消息队列 RabbitMQ 版入门训练营」。
178 18
|
5月前
|
消息中间件 运维 Java
【揭秘RabbitMQ背后的秘密!】如何确保消息正确发送及消费?深入剖析与实战指南!
【8月更文挑战第24天】本文通过一个电商平台订单确认消息的案例,深入探讨了如何确保消息准确无误地发送到 RabbitMQ 以及如何保证消息被正确处理。为确保消息成功发送,文中介绍了使用发布确认、设置重试机制及事务处理等策略;并通过 Java 代码示例展示了如何实施这些策略。此外,还讨论了确保消息正确消费的方法,包括使用确认机制、设置超时及异常处理等,并提供了相应的 Java 示例代码。这些技术和策略有助于提升系统的稳定性和可靠性,对日常运维和性能优化具有重要意义。
68 1
|
8月前
|
消息中间件 存储 安全
【深入浅出RocketMQ原理及实战】「底层原理挖掘系列」透彻剖析贯穿RocketMQ的消息顺序消费和并发消费机制体系的原理分析
【深入浅出RocketMQ原理及实战】「底层原理挖掘系列」透彻剖析贯穿RocketMQ的消息顺序消费和并发消费机制体系的原理分析
109 0
|
5月前
|
区块链 C# 存储
链动未来:WPF与区块链的创新融合——从智能合约到去中心化应用,全方位解析开发安全可靠DApp的最佳路径
【8月更文挑战第31天】本文以问答形式详细介绍了区块链技术的特点及其在Windows Presentation Foundation(WPF)中的集成方法。通过示例代码展示了如何选择合适的区块链平台、创建智能合约,并在WPF应用中与其交互,实现安全可靠的消息存储和检索功能。希望这能为WPF开发者提供区块链技术应用的参考与灵感。
71 0
|
8月前
|
消息中间件 存储 Apache
RocketMQ实战教程之常见概念和模型
Apache RocketMQ 实战教程介绍了其核心概念和模型。消息是基本的数据传输单元,主题是消息的分类容器,支持字节、数字和短划线命名,最长64个字符。消息类型包括普通、顺序、事务和定时/延时消息。消息队列是实际存储和传输消息的容器,是主题的分区。消费者分组是一组行为一致的消费者的逻辑集合,也有命名限制。此外,文档还提到了一些使用约束和建议,如主题和消费者组名的命名规则,消息大小限制,请求超时时间等。RocketMQ 提供了多种消息模型,包括发布/订阅模型,有助于理解和优化消息处理。