2012-10-31 74 views
0

不用担心:您可以让您的客户重新连接到群集,并且 重新创建队列,对吧?只有当队列本来不是 标记持久。如果重新创建的队列被标记为“持久”,那么 将从另一个节点重新声明它们会给您带来难看的404 NOT_FOUND错误。 这可确保将故障节点恢复到群集时,该故障节点上该队列中的消息不会消失。 将特定队列名称返回到群集的唯一方法是 实际上还原失败的节点。但是,如果消费者尝试使用 重新创建的队列不耐用,则重新声明将会成功,并且您准备重新绑定它们并继续进行卡车运输。RabbitMQ in Action:群集中的队列

在作者说,持久队列不能重新声明为使数据不丢失,如何理解这个?

回答

1

问题在于RabbitMQ在哪里保留发布的消息。如果您在节点A中声明队列,则队列消息将存在于该节点中。复制的是队列元数据,即队列属性,但不包含消息。因此,如果节点A死亡,那么在该节点中,您拥有发布到该队列的消息。

所以我们假设你现在去节点B并重申声明那个队列,它也是持久的,就像它在节点A中一样。如果允许那个过程,那么你将失去所有来自节点B的消息,因为代理会认为队列居住在节点B中。

+0

谢谢!我会为此做一些测试 – ligaoren