知识卡片

无界内部队列会拖垮应用

专业/工作 · 592.i

内容

RabbitMQ早期客户端的QueueingConsumer在内部用一个无限增长的阻塞队列缓存Broker推送来的消息,一旦消息堆积过多就会在消费者进程里造成内存溢出,进而拖累同一条TCP连接上所有其他信道的性能,甚至引发死锁。这个缺陷最终被官方废弃,替换为直接在Basic.Deliver的回调里处理消息、并用prefetchCount限流的消费方式([[Qos限流像TCP滑动窗口]])。发散:任何”先攒到内部缓冲区再慢慢处理”的设计,如果缓冲区大小不受限,本质上只是把背压问题往后拖延而非解决——真正的限流必须发生在数据进入缓冲区之前。

参考来源

《RabbitMQ实战指南》第4章《RabbitMQ进阶》