RabbitMQ配置死信队列超时时间的三种方式

_

配置方式

一、queue 属性配置 message-ttl

在创建 queue 时指定属性 message-ttl,该配置一旦设置后便不可更改,如果需要修改则需要先删除 queue 后重新创建并指定 tll。该配置适用于这个 queue 中的所有消息。

Queue queue = QueueBuilder.durable("queue-name")
    .deadLetterExchange("dead-letter-exchange-name")
    .deadLetterRoutingKey("dead-letter-routing-key-name")
     //指定message-ttl时间
    .ttl(1000 * 60 * 60)
    .build();
springBean.registerBean("queue-name", queue);

二、 使用策略(policy)指定 queue 的 message-ttl

1. 使用 rabbitmqctl 命令

rabbitmqctl set_policy -p /my_vhost TTL "queue-name" '{"message-ttl":60000}' --apply-to queues

该方式只能在 rabbitmq 运行的服务器中使用该命令执行

2. 使用 rabbitmq management 的 API 修改 policy

curl -u username:password -X PUT -H "Content-Type: application/json" \
http://<rabbitmq-server>:15672/api/policies/my_vhost/TTL \
-d '{
  "pattern": "queue-name",
  "definition": {"message-ttl":60000},
  "apply-to": "queues",
   "priority": 0
}'

注意:queue-name 这部分支持正则表达式,因此可配置多种策略(如使用 ".*" 表示所有 queue),最后按匹配度和优先级选择。

三. MQ 生产者发送消息时指定消息的 expiration 时间

在每次推送消息时指定 expiration

Message.getMessageProperties().setExpiration("600000");

三种方式的关系

三种配置方式可同时存在,但存在以下情形:

1. 当 queue 的属性配置了 message-ttl 后,将不再应用 policy 的 tll 设置

2. 当 queue 存在属性 message-ttl 时,如果通过发送消息指定 expiration 时间,那么实际 tll 会使用两者中最小的时间。比如 message-ttl 设置 60 秒,而 expiration 设置 90 秒,那么该消息的 ttl 时间为 60 秒,反之如果 message-ttl 设置 90 秒,而 expiration 设置 80 秒,那么该消息的 ttl 则是 80 秒。

3. 如果不存在 queue 的属性 message-ttl 时,通过发送消息时指定 expiration 的时间的优先级是大于 policy 的 ttl 设置的。

参考资料:

STOMP Plugin | RabbitMQ
Time-To-Live and Expiration | RabbitMQ

收集的Java性能优化文章 2024-12-20

评论区