我有一个Rabbitmq群集设置(没有HA)。我的消费者是spring应用程序,它提供了一个开箱即用的故障转移机制,它连接到下一个可用节点。
由于队列没有镜像,如果我在前面声明队列并且第一个节点发生故障时,可以建立到第二个节点的连接。这有意义吗?
另一个问题,假设我在Rabbitmq集群之上有一个负载平衡。我的应用程序使用负载平衡连接。是否会在所有节点上声明队列,或者是否会根据LB的路由策略在节点上声明队列。
答案 0 :(得分:0)
对于第一种情况,是的,在建立连接时,将在故障转移代理实例上声明队列。
如果要在所有节点上预先声明,则每个节点都需要一个连接工厂,每个连接工厂需要一个RabbitAdmin
。
您还需要一些能够在每个连接上打开连接(RabbitAdmin
s自己注册为连接侦听器。)
您可以通过添加实现SmartLifecycle
的bean并在每个连接工厂调用createConnection()
来实现。
您还可以选择性地声明元素。请参阅Conditional Declaration。
默认情况下,所有队列,交换和绑定都由应用程序上下文中的所有
RabbitAdmin
实例(具有auto-startup="true"
)声明。从1.2版本开始,可以有条件地声明这些元素。当应用程序连接到多个代理并且需要指定应声明特定元素的代理时,这尤其有用。