使用 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 进行故障转移的主要内容,如果未能解决你的问题,请参考以下文章
带有 AMQP 和 RabbitMQ 的 Spring,带有可选 x-dead-letter-exchange 的队列
RabbiMQ基础以及spring-boot-starter-amqp使用
译: 1. RabbitMQ Spring AMQP 之 Hello World