RabbitMQ 集群节点故障

Posted

技术标签:

【中文标题】RabbitMQ 集群节点故障【英文标题】:RabbitMQ Clustering node failure 【发布时间】:2017-06-16 00:47:01 【问题描述】:

我有一个 RabbitMQ 集群(无 HA)设置,其中包含多个实例中的节点。从文档中,我的理解是,在集群模式下,队列没有镜像,它由声明它的节点拥有。

那么,现在的问题是,当拥有队列的节点宕机时会发生什么?如果我错了,请纠正我,因为队列没有镜像,客户端应用程序会因为缺少队列而抛出。

我们是否应该编写逻辑来确定节点是否出现故障,必须重新声明队列,在这种情况下,消息会发生什么?

【问题讨论】:

如果节点拥有队列死了,队列死了,消息死了。你可以检查存在,然后决定是否声明。 【参考方案1】:

那么,现在的问题是,当拥有队列的节点宕机时会发生什么?

来自docs:

当 RabbitMQ 退出或崩溃时,它会忘记队列和消息,除非你告诉它不要这样做。确保消息不会丢失需要做两件事:我们需要将队列和消息都标记为持久。

下一个问题:

我们是否应该编写逻辑来确定节点是否出现故障,必须重新声明队列,在这种情况下,消息会发生什么?

是的,重新声明队列是个好主意。

如果您的节点出现故障,则连接到它的所有消费者都将断开连接。每次消费者连接时,它应该假设它的队列不存在,因此它需要在连接时触发declare queue请求作为第一个请求。

如果消费者发送declare queue 请求并排队does exist 那么:

declare queue 不会影响队列的 以任何方式发送消息。如果消息被持久化,它们将继续存在 在队列中。

正常情况下(如果不改变队列的 properties) 不会抛出任何错误

【讨论】:

以上是关于RabbitMQ 集群节点故障的主要内容,如果未能解决你的问题,请参考以下文章

rabbitmq集群故障恢复

RabbitMQ配置负载均衡的意义及RabbitMQ集群是否可以随意使用

rabbitmq集群故障恢复详解

RabbitMQ集群恢复与故障转移的5种解决方案

rabbitMQ故障恢复与故障转移

为什么要运行消息队列(例如RabbitMQ)集群?