RabbitMQ集群和镜像队列在幕后的行为

RabbitMQ集群和镜像队列在幕后的行为,rabbitmq,haproxy,high-availability,Rabbitmq,Haproxy,High Availability,有人能解释一下,当发布到从属节点时,RabbitMQ集群中的多个节点和队列以镜像方式出现在幕后的情况吗 从我所读到的内容来看,除了发布之外的所有动作似乎都只发送给主控,然后主控将动作的效果广播给从控(这是文档中的内容)。根据我的理解,这意味着使用者将始终使用来自主队列的消息。此外,如果我向从机发送一个消费消息的请求,该从机将通过到达主机获取该消息来进行额外的跳跃 但是当我发布到从属节点时会发生什么呢?这个节点是否也会首先向主节点发送消息 在与奴隶打交道时,似乎有太多额外的跳跃,因此,如果你只认识

有人能解释一下,当发布到从属节点时,RabbitMQ集群中的多个节点和队列以镜像方式出现在幕后的情况吗

从我所读到的内容来看,除了发布之外的所有动作似乎都只发送给主控,然后主控将动作的效果广播给从控(这是文档中的内容)。根据我的理解,这意味着使用者将始终使用来自主队列的消息。此外,如果我向从机发送一个消费消息的请求,该从机将通过到达主机获取该消息来进行额外的跳跃

但是当我发布到从属节点时会发生什么呢?这个节点是否也会首先向主节点发送消息

在与奴隶打交道时,似乎有太多额外的跳跃,因此,如果你只认识主人,你可能会有更好的表现。但是你如何处理大师级的失败呢?然后其中一个奴隶将被选为主人,所以你必须知道连接到哪里

问所有这些问题是因为我们使用的是RabbitMQ集群,前面是HAProxy,所以我们可以将集群结构与应用程序分离。这样,无论何时节点完成,HAProxy都将重定向到活动节点。但是,当我们杀死一个兔子节点时,我们会遇到问题。与rabbit的连接是永久性的,因此如果它失败,您必须重新创建它。此外,在这种情况下,您必须重新发送消息,否则将丢失它们

即使如此,消息仍然可能丢失,因为当我杀死一个节点时,它们可能正在传输中(在一些缓冲区中,网络上的某个地方等等)。因此,您必须使用事务或publisher确认,这保证了在所有镜像中都充满消息后的传递。但这里还有另一个问题。您可能有重复的消息,因为代理可能发送了从未到达生产者的确认(由于网络故障等)。因此,消费者应用程序将需要执行重复数据消除或以幂等方式处理传入消息

有没有办法避免这种情况?或者我必须决定是否可以丢失几条消息,而不是重复一些消息

有人能解释一下,当发布到从属节点时,RabbitMQ集群中的多个节点和队列以镜像方式出现在幕后的情况吗

博客准确地描述了发生了什么

但是当我发布到从属节点时会发生什么呢?这个节点是否也会首先向主节点发送消息

消息将被重定向到主队列,即创建队列的节点

但是你如何处理大师级的失败呢?然后其中一个奴隶将被选为主人,所以你必须知道连接到哪里

同样,这也包括在内。本质上,您需要一个单独的服务来轮询RabbitMQ并确定节点是否处于活动状态。RabbitMQ为此提供了一个解决方案。您的发布和使用应用程序需要直接引用此服务,或通过相互数据存储引用此服务,以确定要发布到或使用的正确节点

与rabbit的连接是永久性的,因此如果它失败,您必须重新创建它。此外,在这种情况下,您必须重新发送消息,否则将丢失它们

您需要订阅连接中断事件以对断开的连接作出反应。您需要在客户端上构建某种程度的冗余,以确保消息不会丢失。如上所述,我建议您引入一个专门设计用于查询RabbitMQ的服务。您的客户端可以尝试将消息发布到最后一个已知的活动连接,如果失败,客户端可能会要求监视器服务提供RabbitMQ群集的最新列表。假设存在至少一个活动节点,则客户端可随后建立到该节点的连接并成功发布消息

即使如此,消息仍然可能丢失,因为当我杀死一个节点时,它们可能正在传输中

有些边缘情况是冗余无法覆盖的,RabbitMQ也无法覆盖。例如,当消息到达队列时,HA策略调用后台进程将消息复制到备份节点。在此过程中,在将消息持久化到备份节点之前,消息可能会丢失。如果活动节点立即出现故障,消息将永久丢失。对此无能为力。不幸的是,当我们降低到实际字节在线路上传输的水平时,我们可以构建的保护数量是有限的

因此,消费者应用程序需要执行重复数据消除或以幂等方式处理传入消息

您可以通过多种方式处理此问题。例如,将
消息ttl
设置为相对较低的值将确保重复的消息不会在队列中保留较长时间。您还可以使用唯一的引用标记每条消息,并在消费者级别检查该引用。当然,这需要存储一个已处理消息的缓存,以便将传入消息与其他消息进行比较;其思想是,如果先前处理的消息到达,其标记将被消费者缓存,并且消息可以被忽略


我要强调的一点是,通常使用AMQP和基于队列的解决方案时,您的基础架构提供了工具,而不是整个解决方案。您必须根据业务需要弥合这些差距。通常,最佳解决方案是通过反复试验得出的。我希望我的建议有用。如果您感兴趣,我会在这里发布一些RabbitMQ设计解决方案的博客,包括您提到的问题。

谢谢您,Paul。你是上帝。为了确保在我开始实施之前,你能确认一下:1)我仍然可以使用