持久性和耐久性概念在AMQP中的混乱

ahj*_*ahj 7 amqp rabbitmq qpid

对这两个术语有点困惑,我在想具有持久消息但是瞬态(非持久)队列的目的是什么?毕竟,如果代理重新启动并且队列未恢复,则将浪费恢复的消息.

pin*_*ain 4

您可以拥有持久队列,但具有“致命”消息,因此在代理重新启动后,您仍然可以拥有队列,但它将是空的,反之亦然,但当您悲伤时,是的,您将丢失队列中的所有消息。

在您提供的消息持久性选项的组合中确实没有用,但不会导致错误。

但是,如果您将备用交换绑定到要向其发布消息的交换,并且它是持久的,则在重新启动后,如果您没有声明瞬态队列,则可以将消息路由到它。

例子:

假设我们有这样的组合和正确绑定的队列,Q*1接收消息M*1Q*2- M*2

[    Exchange-main/durable   ] + [Exchange-alternate/durable]
[Qm1/transient][Qm2/transient]   [Qax1/durable][Qax2/durable]
Run Code Online (Sandbox Code Playgroud)

让我们发布消息[Mt1/transient]和`[Md1/durable],我们会得到这样的情况:

[    Exchange-main/durable   ] + [Exchange-alternate/durable]
[Qm1/transient][Qm2/transient]   [Qax1/durable][Qax2/durable]
[Mt1/transient]
[Md1/durable]
Run Code Online (Sandbox Code Playgroud)

重启后我们会得到

[    Exchange-main/durable   ] + [Exchange-alternate/durable]
                                 [Qax1/durable][Qax2/durable]
Run Code Online (Sandbox Code Playgroud)

让我们再次发布两条消息,[Mt1/transient]以及`[Md1/durable]:

[    Exchange-main/durable   ] + [Exchange-alternate/durable]
                                 [Qax1/durable][Qax2/durable]
                                 [Mt1/transient]
                                 [Md1/durable]
Run Code Online (Sandbox Code Playgroud)

因此,再次重新启动代理:

[    Exchange-main/durable   ] + [Exchange-alternate/durable]
                                 [Qax1/durable][Qax2/durable]
                                 [Md1/durable]
Run Code Online (Sandbox Code Playgroud)