3

我正在使用 Spring 编写服务,并且正在使用 Spring AMQP 连接到 Rabbitmq。

我有两个 rabbitmq 集群,一个仅用于发布消息(消息通过联邦插件发送到另一个集群),另一个集群用于声明最终用户将从中消费的队列。

节点位于 aws lb 后面,每个集群都有一个 lb。

我在我的代码中使用 CachingConnectionFactory 和 RabbitTemplate,RabbitAdmin 并且我想连接到所有节点以便我可以使用它们。对于将包含我添加到配置中的队列的集群,queue-master-locator=random 以便在集群中的所有节点中声明新队列,即使我的服务与它们没有连接。

对于发布消息的集群,我遇到了更多问题,因为我需要在我的服务中直接连接到每个节点,这样我就能够分离节点之间的负载。

所以我的问题是,如何在我的服务中创建与集群中所有节点的连接,以便它们都用于声明队列和发送消息?

现在,在我对这个问题有了某种解决方案之后,下一个问题将是当一个新节点添加到集群时会发生什么?如何创建与它的连接并开始使用它?

我正在使用 Rabbitmq - 3.7.9、Spring - 2.0.5、Spring AMQP - 2.0.5

非常感谢!

4

1 回答 1

1

目前没有机制可以做这样的事情。

默认情况下,Spring AMQP 只打开一个连接(可选两个,一个用于发布,一个用于消费)。

即使使用CacheMode.CONNECTION,您也会为每个消费者获得一个新连接(并且将根据生产者的需要创建和缓存连接),您将无法控制它连接到哪个节点;这是LB的功能。

该框架确实提供了LocalizedQueueConnectionFactory将尝试从托管队列的节点消费的内容,但它不适用于适当的负载均衡器。

然而,一般来说,很少需要这种优化。

您是否正在尝试解决您现在遇到的实际问题,或者您认为可能存在问题的事情?

通常最好不要执行过早的优化。

于 2018-12-20T14:11:35.483 回答