更新时间:2025-07-31 GMT+08:00

配置RabbitMQ惰性队列

默认情况下,RabbitMQ生产者生产的消息存储在内存中,当需要释放内存时,会将内存中的消息换页至磁盘中。换页操作会消耗较长的时间,且换页过程中队列无法处理消息。

如果生产速度过快(例如执行批处理任务),或者消费者由于各种原因(例如消费者下线、宕机)长时间内无法消费消息,导致消息大量堆积,使得内存使用率过高,换页频繁,可能会影响其他队列的消息收发。这种场景下,建议您启用惰性队列。

惰性队列(Lazy Queue)会尽可能的将消息存入磁盘中,在消费者消费到相应的消息时才会被加载到内存中,这样可以减少内存的消耗,但是会增加I/O的使用,影响单个队列的吞吐量。惰性队列的一个重要的设计目标是能够支持更长的队列,即支持更多的消息存储/消息堆积。

处于以下情况时,推荐使用惰性队列

  • 队列可能会产生消息堆积。
  • 队列对性能(吞吐量)的要求不是非常高,例如TPS 1万以下的场景。
  • 希望队列有稳定的生产消费性能,不受内存影响而波动。

处于以下情况时,无需使用惰性队列

  • RabbitMQ需要高性能的场景。
  • 队列总是很短(即队列中没有消息堆积)。
  • 设置了最大长度策略。

更多关于惰性队列的说明,请参考Lazy Queues

约束与限制

RabbitMQ 3.8.35及以上版本支持惰性队列。

配置惰性队列

队列具备两种模式:default和lazy,默认模式为default,lazy模式即为惰性队列的模式。

如果一个队列同时使用几种方式设置的话,Policy的方式具备更高的优先级。

  • Java客户端:通过调用channel.queueDeclare方法的时候在参数中设置。
  • RabbitMQ WebUI:通过Policy的方式设置。
  • RabbitMQ控制台:创建队列时设置。
以下示例演示在Java客户端通过调用channel.queueDeclare设置惰性队列
Map<String, Object> args = new HashMap<String, Object>();
args.put("x-queue-mode", "lazy");
channel.queueDeclare("myqueue", false, false, false, args);
  1. 登录RabbitMQ实例的Web UI
  2. 在菜单栏,选择“Admin”。

    图1 选择Admin菜单

  3. 在左侧导航栏选择“Policies”,进入“Policies”页面。
  4. 新增一个策略。

    图2 新增一个策略
    表1 策略参数说明

    参数

    说明

    Virtual Host

    设置策略所应用的Vhost。“/”表示默认Vhost。

    Name

    策略的名称,用户自定义。

    Pattern

    Queue的匹配模式(正则表达式)。

    Apply to

    策略所适用的目标。选择“Queues”。

    Priority

    策略的优先级,数字越大,优先级越高。

    Definition

    通过“queue-mode=lazy”,配置惰性队列。

  5. 单击“Add/update policy”。

    策略添加成功后如下图所示。

    图3 查看惰性队列策略

  1. 参考创建RabbitMQ Queue创建队列,并在“惰性队列模式”中输入“lazy”,完成惰性队列的创建。

    图4 创建惰性队列

  2. 在Queue列表中,单击新创建的队列后的“查看详情”,进入“查看详情”页面。

    当“惰性队列模式”显示“lazy”时,表示惰性队列创建成功。

    图5 查看队列详情

相关文档

如果您希望通过API创建惰性Queue,请参考创建Queue