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

时间:2013-07-18 09:27:47

标签: rabbitmq amqp qpid

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

1 个答案:

答案 0 :(得分:4)

你可以拥有持久的队列但是有“凡人”的​​消息,所以在经纪人重启之后你仍然可以有队列,但它会是空的,反之亦然,但是你很伤心,是的,你将丢失队列中的所有消息。 / p>

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

但是如果你将alternate exchange绑定到交换,那么你就是要发布消息并且它是持久的,重新启动后,如果你没有声明临时队列,你可以将消息路由到它。

示例:

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

[    Exchange-main/durable   ] + [Exchange-alternate/durable]
[Qm1/transient][Qm2/transient]   [Qax1/durable][Qax2/durable]

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

[    Exchange-main/durable   ] + [Exchange-alternate/durable]
[Qm1/transient][Qm2/transient]   [Qax1/durable][Qax2/durable]
[Mt1/transient]
[Md1/durable]

重启后我们会得到

[    Exchange-main/durable   ] + [Exchange-alternate/durable]
                                 [Qax1/durable][Qax2/durable]

让我们再次发布两条消息,[Mt1/transient]和`[Md1 /耐用]:

[    Exchange-main/durable   ] + [Exchange-alternate/durable]
                                 [Qax1/durable][Qax2/durable]
                                 [Mt1/transient]
                                 [Md1/durable]

所以,再次重启经纪人:

[    Exchange-main/durable   ] + [Exchange-alternate/durable]
                                 [Qax1/durable][Qax2/durable]
                                 [Md1/durable]