ActiveMQ Artemis 配置具有故障转移和静态分配队列的独立代理

ActiveMQ Artemis configure standalone brokers with failover and statically assigned queues

我正在尝试弄清楚如何利用 ActiveMQ Artemis 来实现以下拓扑。我确实需要让几个生产者写入两个独立的 Artemis 代理上托管的队列。目前每个生产者都创建了两个连接工厂来处理与 2 个代理的连接并创建相应的队列。

    @Bean
    public ConnectionFactory jmsConnectionFactoryBroker1() {
        ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(brokerUrl_1,username,password);
        return connectionFactory;
    }

    @Bean
    public ConnectionFactory jmsConnectionFactoryBroker2() {
        ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(brokerUrl_2,username,password);
        return connectionFactory;
    }

我的主要问题是我需要知道哪个队列分配给哪个代理,同时我需要知道如果一个代理由于某种原因宕机,我可以为另一个代理重新创建该队列即时代理并避免丢失任何进一步的消息。所以我的方法是如下设置代理 urls

artemis.brokerUrl_1=(tcp://myhost1:61616,tcp://myhost2:61616)?randomize=false
artemis.brokerUrl_2=(tcp://myhost2:61616,tcp://myhost1:61616)?randomize=false

所以为每个经纪人使用不同的 JmsTemplate url 我的意图是在提到 JmsTemplate 使用 brokerUrl_1 会在 myhost1 上创建队列,相应的 JmsTemplate 也是如此 brokerUrl_2.

我原以为(由于随机化参数)每个队列都会有某种代理的静态成员资格,并且在代理失败的情况下,会通过重新创建队列来进行某种迁移从头开始到另一个经纪人。

相反,我注意到几乎每次队列创建的分布都不会像感知的那样发生,而是随机发生,因为相同的队列可以出现在任何一个代理中,这是不可取的 对于我的用例。

我如何处理这种情况并以一种可以在预定义代理上创建队列并具有故障安全的方式解决我的问题,如果一个代理关闭,生产者将创建与该代理相同的队列 其他经纪人并继续?

请注意,在代理之间共享状态不是一种选择

randomize=false 不适用于 Artemis 核心 JMS 客户端。它仅适用于与 ActiveMQ 5.x 一起分发的 OpenWire JMS 客户端。 select 从 URL 连接哪个连接器由 the documentation 中讨论的连接负载平衡策略决定。默认的连接负载平衡策略是 org.apache.activemq.artemis.api.core.client.loadbalance.RoundRobinConnectionLoadBalancingPolicy,它将 select 来自 URL 列表的 随机 连接器,然后是循环连接。还有其他可用的政策,如果其中 none 为您提供了您想要的行为,那么您可以实施自己的政策。

也就是说,听起来您真正 want/need 是 2 经纪人,其中每一对都包含一个实时和一个备份。这样,如果实时代理发生故障,那么所有客户端都可以故障转移到备份,并且您不必处理您试图实现的这种“假”故障转移功能的任何其他复杂性。

此外,由于您正在使用 Spring 的 JmsTemplate,您应该 它使用的可能会对性能产生负面影响。