我有一个RabbitMQ集群(没有HA)设置,多个实例中有节点。从文档中,我理解的是,在集群模式下,队列不是镜像的,而是由声明它的节点所拥有。
那么,现在的问题是,当拥有队列的节点出现故障时会发生什么?如果我错了,请纠正我,因为队列没有镜像,客户端应用程序将丢失队列。
我们是否应该编写逻辑来确定节点是否发生故障,必须重新声明队列,在这种情况下,消息会发生什么?
答案 0 :(得分:1)
那么,现在的问题是,当拥有队列的节点发生故障时会发生什么?
来自docs:
当RabbitMQ退出或崩溃时,它会忘记队列和消息,除非你告诉它不要。需要做两件事来确保消息不会丢失:我们需要将队列和消息都标记为持久。
下一个问题:
我们是否应该编写逻辑来确定节点是否发生故障,必须重新声明队列,在这种情况下,消息会发生什么?
是的,重新声明你的队列是一个好主意。
如果您的节点发生故障,与其连接的所有消费者都将断开连接。每次消费者连接时,它应该假设它的队列不存在,因此,它需要在连接时作为第一个请求发出declare queue
个请求。
如果消费者发送declare queue
请求和队列does exist
,则:
declare queue
不会影响队列
消息以任何方式。如果消息持续存在,它们将继续存在
在队列中。
在正常情况下(如果你不改变队列的话) 属性)不会抛出任何错误