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 集群节点故障的主要内容,如果未能解决你的问题,请参考以下文章