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

2022-11-30 15:08:45 浏览数 (1)

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-intshort-intlong-int或long-long-int.

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

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

rabbitmqctl

rabbitmqctl set_policy TTL “.*” ‘{“message-ttl”:60000}’ --apply-to queues

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

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

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

可以将消息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秒:

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官网

0 人点赞