【发布时间】:2014-11-26 01:43:51
【问题描述】:
有人可以解释一下在发布到从节点时,具有多个节点和队列的 RabbitMQ 集群的幕后情况吗?
根据我的阅读,似乎除了发布之外的所有操作都只发送给主服务器,然后主服务器将操作的效果广播给从服务器(这是来自文档)。根据我的理解,这意味着消费者将始终使用主队列中的消息。此外,如果我向从站发送请求以使用消息,则从站将通过到达主站获取该消息来进行额外的跳跃。
但是当我发布到从节点时会发生什么?这个节点会做同样的事情,首先将消息发送给主节点吗?
在处理slave时似乎有很多额外的hop,所以如果你只知道master,似乎你的性能会更好。但是你如何处理主失败?那么其中一个slave将被选为master,所以你必须知道连接到哪里?
问这一切是因为我们在前面使用带有 HAProxy 的 RabbitMQ 集群,因此我们可以将集群结构与我们的应用程序解耦。这样,每当一个节点完成时,HAProxy 都会重定向到活节点。但是当我们杀死其中一个兔子节点时,我们遇到了问题。与 rabbit 的连接是永久性的,因此如果失败,您必须重新创建它。此外,在这种情况下,您必须重新发送消息,否则您将丢失它们。
即使所有这些,消息仍然可能丢失,因为当我杀死一个节点时它们可能正在传输中(在某些缓冲区,网络上的某个地方等)。所以你必须使用事务或发布者确认,它保证在所有镜像都被消息填满后交付。但这里有另一个问题。您可能有重复的消息,因为代理可能发送了从未到达生产者的确认(由于网络故障等)。因此,消费者应用程序将需要执行重复数据删除或以幂等方式处理传入消息。
有没有办法避免这种情况?或者我必须决定是否可以丢失几条消息还是重复一些消息?
【问题讨论】:
标签: rabbitmq haproxy high-availability