RabbitMQ消息持久化:惰性队列和持久化传递模式的区别

RabbitMQ message persistency : difference between lazy queue and persistent delivery mode

我正在设置具有高可用性的 RabbitMQ (v3.8.0) 集群。

为了启用消息持久性,我将交换器和队列 durable 参数设置为 True。

{
    "exchanges": [
        {
            "name": "my_direct_exchange",
            "vhost": "my_vhost",
            "type": "direct",
            "durable": true,
            "auto_delete": false,
            "internal": false,
            "arguments": {}
        }
    ],
    "queues": [
        {
            "name": "my_queue_direct",
            "vhost": "my_vhost",
            "durable": true,
            "auto_delete": false,
            "arguments": {}
        }
    ]
}

那么,好像有两个选择:

"policies": [
        {
            "vhost": "my_vhost",
            "name": "my_policy",
            "pattern": "",
            "apply-to": "all",
            "definition": {
                "ha-mode": "all",
                "ha-sync-mode": "automatic",
                "queue-mode": "lazy"
            }
        }
    ]

这两个选项都会将消息存储在磁盘上。 它们之间有什么区别?

To enable messages persistency, I set exchanges and queues durable parameter to True.

澄清一下,交换器和队列的 durable 参数不会影响 individual 消息持久性。 durable 参数确保这些交换器和队列在代理重新启动后仍然存在。的确,如果您有一个包含持久消息的非持久队列,并重新启动代理,该队列和那些消息将会丢失,因此 durable 参数很重要。

你应该使用 persistent 标志,即使是惰性队列。为什么?因为你也应该使用Publisher Confirms,并且只有在设置persistent时写入磁盘时才会确认消息。


注意: RabbitMQ 团队监控 rabbitmq-users mailing list 并且有时只在 Whosebug 上回答问题。