能有人请解释发布到从属节点时是怎么回事幕后与多个节点和镜像方式队列中的RabbitMQ集群背后集群和镜像队列的行为呢?RabbitMQ的场景
从我所读到的看来,发布以外的所有操作似乎只发送给主服务器,然后主服务器将这些操作的效果广播给从服务器(这来自文档)。根据我的理解,这意味着消费者将始终使用主队列中的消息。另外,如果我向一个消息发送一个请求给一个从机,那么这个从机将通过到达主机来获取该消息来做额外的跳跃。
但是当我发布到从属节点会发生什么?此节点是否会将首先发送消息的信息发送给主服务器?
似乎有奴隶打交道时,许多附加跳,这样看来,如果你只知道主,你可以有更好的表现。但是,你如何处理主人失败?那么其中一名奴隶将被选为主人,所以你必须知道在哪里连接?
问这一切,因为我们使用的是RabbitMQ的集群HAProxy的前面,所以我们可以从脱钩我们的应用程序的集群结构。这样,无论何时节点完成,HAProxy都会重定向到活节点。但是当我们杀死一个兔子节点时,我们遇到了问题。与兔子的连接是永久的,所以如果失败了,你必须重新创建它。此外,你必须在这种情况下重新发送消息,否则你将失去它们。
即使所有这些,仍然可能会丢失消息,因为当我杀死一个节点时(在某些缓冲区中,网络中的某处),它们可能正在传输中。因此,您必须使用交易或发行商确认,以确保在所有镜像填满消息后交付。但这里还有一个问题。您可能有重复的消息,因为代理可能发送了从未到达生产者的确认(由于网络故障等)。因此消费者应用程序需要执行重复数据删除或以幂等方式处理传入的消息。
是否有避免这种方式?或者我必须决定是否可以丢失几条消息而不是重复某些消息?
谢谢保罗。你是上帝。只是为了确保在执行之前能够确认这一点:1)我仍然可以使用HAProxy并且发布者确认,并且我不会丢失任何消息。我将有重复的消息,我必须以某种方式删除。我会遇到性能问题(由于第一次到达从机时会额外跳跃到主机),但我的数据将是“防弹”的。 2)为了提高性能,我将创建一个监视器服务,以便每次只将我的请求发送给主服务器,但我仍然需要处理重复的问题。谢谢。 – 2014-11-26 10:45:57
您仍然可以使用HAProxy,但您会因循环配置而产生额外的网络跳数。如果你想实现负载均衡,请阅读下面的内容:http://insidethecpu.com/2014/11/17/load-balancing-a-rabbitmq-cluster/你将不会有重复的消息。我认为设置message-ttl属性足以删除重复项,尽管如前所述添加参考标记可以解决问题。我将在C#中发布一个RabbitMQ库,可以很快实现上述所有功能。继续监控我的博客的更新。 – 2014-11-26 11:06:19
其实我最终有重复的消息。我跑了一次测试几次发布10000个消息到2节点兔子集群。我杀了一个节点,我收到了10011-10012条消息。我的一个消费API是幂等的,所以最终的结果是好的。非常感谢。 – 2014-11-26 11:50:09