Appearance
RabbitMQ 队列溢出策略
RabbitMQ 默认情况下不会限制队列的长度,也就是说,队列可以无限地增长,直到耗尽系统资源为止。如果你没有对队列设置任何长度限制,RabbitMQ 不会主动丢弃消息或拒绝新消息。
然而,当你为队列设置了最大长度(max-length)或最大字节数(max-length-bytes)后,RabbitMQ 的默认行为是丢弃最早的消息(FIFO),我们可以通过配置来明确 RabbitMQ 在队列达到最大长度限制时的具体处理方式。
以下是常用的配置选项:
设置队列最大长度:
Basharguments.put("x-max-length", 最大消息数); arguments.put("x-max-length-bytes", 最大字节数);指定溢出策略:
drop-head(默认值):丢弃队列头部的消息(最早的消息);reject-publish:拒绝新消息的写入,并向生产者发送异常;reject-publish-dlx:拒绝新消息,并将其发送到死信交换器(DLX);
Basharguments.put("x-overflow", "reject-publish");
Tip
RabbitMQ 不会自动将普通队列转换为惰性队列(Lazy Queue)。惰性队列需要在创建时显式指定。
但即使是普通队列,RabbitMQ 也会在内存压力增大时,将部分消息分页(paging)到磁盘,这是为了防止内存消耗过高。但这与惰性队列的机制不同,惰性队列从设计上就将消息主要存储在磁盘。