配置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控制台:创建队列时设置。
Map<String, Object> args = new HashMap<String, Object>(); args.put("x-queue-mode", "lazy"); channel.queueDeclare("myqueue", false, false, false, args);
- 登录RabbitMQ实例的Web UI。
- 在菜单栏,选择“Admin”。
图1 选择Admin菜单
- 在左侧导航栏选择“Policies”,进入“Policies”页面。
- 新增一个策略。
图2 新增一个策略
表1 策略参数说明 参数
说明
Virtual Host
设置策略所应用的Vhost。“/”表示默认Vhost。
Name
策略的名称,用户自定义。
Pattern
Queue的匹配模式(正则表达式)。
Apply to
策略所适用的目标。选择“Queues”。
Priority
策略的优先级,数字越大,优先级越高。
Definition
通过“queue-mode=lazy”,配置惰性队列。
- 单击“Add/update policy”。
策略添加成功后如下图所示。
图3 查看惰性队列策略
- 参考创建RabbitMQ Queue创建队列,并在“惰性队列模式”中输入“lazy”,完成惰性队列的创建。
图4 创建惰性队列
- 在Queue列表中,单击新创建的队列后的“查看详情”,进入“查看详情”页面。
当“惰性队列模式”显示“lazy”时,表示惰性队列创建成功。
图5 查看队列详情
相关文档
如果您希望通过API创建惰性Queue,请参考创建Queue。