配置消息 TTL 和队列长度限制

使用消息 TTL 和队列长度限制,将队列增长控制在可管理的范围内。这些设置适用于突发流量处理、待机积压控制,以及不应永久保留过期消息的队列。

当相同的限制需要应用到多个队列,或者你希望在不重新声明队列的情况下调整限制时,建议使用 policy,而不是硬编码队列参数。

选择正确的控制方式

Control用途备注
message-ttl在定义的保留窗口后使旧消息过期。停留时间超过 TTL 的消息将有资格过期。
max-length限制队列中的消息数量。当队列条目数量增长比总字节数更重要时使用。
max-length-bytes按字节限制队列大小。适用于负载较大的工作负载。
overflow定义队列达到上限时的行为。可在从队头丢弃或拒绝新的发布之间进行选择。
expires or x-expires使未使用的队列过期。仅用于真正临时的队列,不要用于可长时间处于空闲状态的持久化生产队列。
不要混淆队列过期与消息 TTL

队列过期会删除未使用的队列。消息 TTL 会使消息过期。对于持久化的应用队列和热备队列,请使用 message-ttl 进行积压控制,除非队列本来就是临时性的,否则应避免使用 expires

应用队列 policy

以下示例将 24 小时的消息保留窗口和队列长度限制应用于默认 virtual host 中以 orders. 开头的队列:

kubectl -n <namespace> exec <instance-name>-server-0 -- \
  rabbitmqctl set_policy -p / backlog-controls \
  '^orders\.' \
  '{"message-ttl":86400000,"max-length":100000,"max-length-bytes":1073741824,"overflow":"reject-publish-dlx"}' \
  --priority 20 \
  --apply-to queues

在此示例中:

  • 超过 24 小时的消息将有资格过期。
  • 队列最多保留 100000 条消息。
  • 队列最多保留 1 GiB 的消息数据。
  • 达到限制后会拒绝新的发布,如果队列配置了 DLX,还可以将这些消息 dead-letter。

如果另一个 policy 已经匹配了相同的队列,请在创建竞争规则之前先查看 policy 优先级。

验证活动 policy

列出 virtual host 中的 policy:

kubectl -n <namespace> exec <instance-name>-server-0 -- \
  rabbitmqctl list_policies -p /

验证队列参数和活动 policy:

rabbitmqadmin \
  --host <management-host> \
  --port 15672 \
  --username <admin-user> \
  --password <admin-password> \
  --vhost / \
  list queues name policy arguments messages message_bytes

设计建议

  • 使用 message-ttl 来限制不应无限增长的待机或 replay 队列。
  • 在高流量队列上使用 max-lengthmax-length-bytes,以免意外的 consumer 故障耗尽磁盘。
  • 当发布者必须获得 backpressure,而不是悄悄丢弃最旧消息时,选择 overflow="reject-publish"overflow="reject-publish-dlx"
  • 仅当应用明确更偏好最新消息而不是最旧积压时,才使用 overflow="drop-head"
  • 根据流量峰值、预期故障窗口以及可用存储来检查限制值。

相关信息