配置消息 TTL 和队列长度限制
使用消息 TTL 和队列长度限制,将队列增长控制在可管理的范围内。这些设置适用于突发流量处理、待机积压控制,以及不应永久保留过期消息的队列。
当相同的限制需要应用到多个队列,或者你希望在不重新声明队列的情况下调整限制时,建议使用 policy,而不是硬编码队列参数。
选择正确的控制方式
不要混淆队列过期与消息 TTL
队列过期会删除未使用的队列。消息 TTL 会使消息过期。对于持久化的应用队列和热备队列,请使用 message-ttl 进行积压控制,除非队列本来就是临时性的,否则应避免使用 expires。
应用队列 policy
以下示例将 24 小时的消息保留窗口和队列长度限制应用于默认 virtual host 中以 orders. 开头的队列:
在此示例中:
- 超过 24 小时的消息将有资格过期。
- 队列最多保留 100000 条消息。
- 队列最多保留 1 GiB 的消息数据。
- 达到限制后会拒绝新的发布,如果队列配置了 DLX,还可以将这些消息 dead-letter。
如果另一个 policy 已经匹配了相同的队列,请在创建竞争规则之前先查看 policy 优先级。
验证活动 policy
列出 virtual host 中的 policy:
验证队列参数和活动 policy:
设计建议
- 使用
message-ttl来限制不应无限增长的待机或 replay 队列。 - 在高流量队列上使用
max-length或max-length-bytes,以免意外的 consumer 故障耗尽磁盘。 - 当发布者必须获得 backpressure,而不是悄悄丢弃最旧消息时,选择
overflow="reject-publish"或overflow="reject-publish-dlx"。 - 仅当应用明确更偏好最新消息而不是最旧积压时,才使用
overflow="drop-head"。 - 根据流量峰值、预期故障窗口以及可用存储来检查限制值。