我想为高可用性创建一个集群,并将负载均衡器放在此集群的前端。在我们的配置中,我们希望手动创建交换和队列,因此创建了一个交换和队列,没有客户端应该调用重新声明它们。我正在使用与路由密钥的直接交换,因此可以将消息路由到不同节点上的不同队列。但是,我在群集和队列方面存在一些问题。
据我在RabbitMQ文档中读到的一个队列是特定于它创建的节点。此外,我们在集群中只能有一个具有相同名称的队列,这些队列在发布/使用操作时应该是活动的。如果节点死亡,那么该节点上的队列将消失,并且消息可能无法恢复(取决于当然的配置)。因此,即使我将相同的消息路由到不同节点中的不同队列,我仍然需要弄清楚如何使用它们来继续消费消息。
我想知道是否可以在不使用镜像队列的情况下处理此故障转移方案。假设我想在发生故障时切换到新节点并继续从同一队列中消耗。由于发布者只使用路由密钥,并且这些消息可以进入多个队列,因此消费者无法获得相同的情况。
简而言之,我可以在第一段中解释环境中的失败。队列镜像是集群中性能损失的最佳方法,还是存在更实用的解决方案?
答案 0 :(得分:0)
数据复制(RabbitMQ中的镜像队列)是实现高可用性的标准方法。我建议使用那些。如果您不复制数据,则会丢失数据。
如果你担心性能 - RabbitMQ不能很好地扩展。 我知道提高性能的唯一方法就是让您的节点更大或创建第二个集群。向集群添加节点并不能真正改善事物。此外,如果您计划使用TLS,它也会显着降低吞吐量。如果您有高吞吐量要求+ HA我会考虑Apache Kafka。
如果您的用例不允许关心HA,那么只要您的消费者/发布者连接到代理,就重新声明队列/交换,这绝对没问题。当你声明队列已经存在时,不会发生任何错误,队列不会被清除等,与交换相同。
另外,请查看RabbitMQ sharding plugin,也许这样可以用于您的用例。