“lazy 队列”曾是对付积压的标准做法:让队列尽量把消息写盘、少占内存。到了 4.x 默认的经典队列又是什么样?x-queue-mode=lazy 还有用吗?quorum 队列的内存账怎么算?这篇用 100000 条消息实际量一遍。
x-queue-mode=lazy: 声明成功
x-queue-mode=default: 声明成功
rabbitmqctl list_queues 里的参数: ['q.default\t[{"x-queue-mode","default"},{"x-queue-type","classic"}]', 'q.lazy\t[{"x-queue-mode","lazy"},{"x-queue-type","classic"}]']
list_queues 能看到的与内存相关的字段: messages_ram, message_bytes_ram, memory;是否有 queue_mode 一类的字段: Falsex-queue-mode=lazy 在 4.3.6 仍能声明,没有报错;但经典队列默认就不再把积压的消息放在内存里,所以带不带这个参数在内存数字上看不出区别。
队列 messages messages_ram message_bytes_ram 队列进程内存 broker 总内存增量 classic.default 100000 1 0.0 MiB 0.7 MiB 1.3 MiB classic.lazy 100000 1 0.0 MiB 1.1 MiB 1.0 MiB
100000 条 1 KB 的持久化消息(共约 100 MB)放进经典队列,messages_ram 只有 1,broker 总内存只增加 1.0~1.3 MiB。
quorum.q: messages=100000 messages_ram=0 message_bytes_ram=0.0 MiB 队列进程内存=4.5 MiB broker 总内存增量=166.3 MiB
同样的消息进 quorum 队列,队列进程内存 4.5 MiB,可是 broker 总内存涨了 166.3 MiB;看队列自己的 memory 字段会低估它。
消费者确认了 2147 条后: messages=97853 messages_ram=568 message_bytes_ram=0.55 MiB 队列进程内存=2.8 MiB
消费者在线时,内存里只有投递窗口附近的消息(568 条、0.55 MiB),积压的 97853 条仍在磁盘上。
重启(关闭 + 启动 + await_startup)总共 11.1 s;重启后 classic.default: messages=97853 messages_ram=1 队列进程内存=0.0 MiB 取 100 条用了 14 ms(重启后消息要从磁盘读)
重启不会把积压的消息整个装进内存:11.1 s 启动后队列里 messages_ram 只有 1,取 100 条用 14 ms 按需读盘。