使用 Spring AMQP 和 RabbitMQ HA 进行故障转移

Posted

技术标签:

【中文标题】使用 Spring AMQP 和 RabbitMQ HA 进行故障转移【英文标题】:Failover with Spring AMQP and RabbitMQ HA 【发布时间】:2018-10-10 04:56:43 【问题描述】:

有多篇文章建议在RabbitMQ集群前使用负载均衡器。

但是,Spring AMQP 也有多个引用正在使用一些 故障转移实现,例如代理恢复运行时重置连接。

我有几个关于这个主题的问题(考虑到这些文章或多或少是旧的,今天是 2018 年)

在使用 Spring AMQP 时,是否仍需要负载均衡?

如果仍然建议使用负载平衡,我将如何解决主队列与其节点的关联?集群节点之间会有很多互连,因为循环负载均衡器命中正确集群节点的成功率为 1-(1/n)

Spring AMQP 是否支持某种拓扑感知,这将允许它从正确的节点消费?

有一些文章建议客户端应该发布/消费到尊重队列位置的节点。这仍然适用吗?考虑到负载平衡、Spring AMQP 故障转移和 CachingConnectionFactory,这一切如何结合在一起?

任何人都可以提供这些主题的答案并提供相关参考资料,这将为验证提供额外信息吗?

非常感谢

【问题讨论】:

【参考方案1】:

对于你的每个子弹:

负载均衡器对 Spring AMQP 的默认配置没有多大意义,因为它打开了一个单一的、长期存在的连接,该连接在所有消费者之间共享。在 2.0 中,您可以配置 RabbitTemplate 以使用单独的连接;这是因为推荐的配置是为发布者/消费者使用不同的连接;这将是 2.1 中的默认设置。

如果您将连接工厂配置为缓存连接(而不仅仅是通道),那么使用负载平衡器可能是有意义的,因为这样每个组件都会获得自己的连接。

见下一个项目符号。

见Queue Affinity and the LocalizedQueueConnectionFactory。它使用管理插件来确定当前哪个节点托管队列并连接到该队列。 它不适用于负载平衡器,因为它需要连接到实际节点

我从多次讨论中了解到,只有在最极端的环境中才需要队列关联性,并且在大多数环境中,差异是无法估量的。但是,环境/网络差异很大,YMMV 所以你可能想测试一下。我的一般经验法则是避免过早优化,因为增加的配置复杂性可能根本不值得受益(而且您可能一开始就没有问题)。

【讨论】:

谢谢,您关于使用拓扑感知工厂进行过早优化的建议非常合理。不过,我有一个补充问题。 CachingConnectionFactory 是否重新连接到再次活跃的节点?我记得一些文章提到,它没有连接到重新连接的节点。这就是建议使用 LocalizedQueueConnectionFactory 的原因。 CachingConnectionFactory 是否支持合理的基于客户端的负载均衡?它如何从提供的列表连接到节点?它是循环、随机还是总是连接到第一个,然后作为故障转移连接到第二个? CCF 仅在当前连接丢失(或使用连接缓存时缓存为空)时重新连接。出于这个原因,它不会在故障转移后进行故障回复,直到新连接丢失。它不进行负载平衡,它从第一个开始,并在需要新连接时沿着列表向下移动。随意打开“改进”JIRA Issue - 我们可以添加负载平衡策略属性。同时,您可以编写一个外部任务来不时调整Addresses[] 属性。 是的,这也是我的想法。感谢您的所有回答

以上是关于使用 Spring AMQP 和 RabbitMQ HA 进行故障转移的主要内容,如果未能解决你的问题,请参考以下文章

040 RabbitMq及数据同步02

带有 AMQP 和 RabbitMQ 的 Spring,带有可选 x-dead-letter-exchange 的队列

RabbiMQ基础以及spring-boot-starter-amqp使用

译: 1. RabbitMQ Spring AMQP 之 Hello World

Spring Boot 2.X - Spring Boot整合AMQP之RabbitMQ

spring amqp rabbitmq fanout配置