知识卡片

惰性队列用I/O开销换稳定内存

专业/工作 · 594.a

内容

默认队列尽可能把消息留在内存以求投递更快(内存/磁盘间的换页机制见[[队列消息四态背后的资源置换逻辑]]),但当内存吃紧需要把消息换页到磁盘时,这个换页动作会阻塞队列、暂停接收新消息,在消息量特别大时体验很差。惰性队列反其道而行——消息一律直接写入磁盘,只有真正要被消费时才加载进内存,代价是内存里几乎不缓存消息(发送1千万条1KB消息时内存开销从1.2GB降到1.5MB),换来的是不会突然遭遇换页阻塞的稳定性。发散:这是”要延迟低但状态不可预测”与”要吞吐可预测但接受额外固定I/O成本”之间的权衡,和很多缓存策略里”预读缓存 vs 按需加载”的取舍是同一个问题。

参考来源

《RabbitMQ实战指南》第9章《RabbitMQ高阶》