当前位置: 首页 > 知识库问答 >
问题:

ActiveMQ Artemis使用故障转移和静态分配队列配置独立代理

沃楷
2023-03-14

我正试图找出如何利用ActiveMQ Artemis来实现以下拓扑结构。我确实需要有几个生产者写到两个独立的Artemis代理上托管的队列。目前,每个生产者创建两个连接工厂,处理到两个代理的连接,并创建相应的队列。

    @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;
    }

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

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

因此,对每个代理url使用不同的JmsTemplate我的意图是,当引用JmsTemplate时,使用brokerurl_1将在myhost1上创建队列,对brokerurl_2创建相应的JmsTemplate也是如此。

我预计(由于随机化参数)每个队列都有某种代理的静态成员资格,在代理失败的情况下,将通过从头重新创建队列到另一个代理来进行某种迁移。

相反,我注意到,几乎每次队列创建的分布都不是按照预期的那样发生的,而是随机的,因为相同的队列可以出现在任一代理中,这对我的用例来说并不理想。

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

共有1个答案

牟黎昕
2023-03-14

randomize=false不适用于Artemis核心JMS客户机。它只适用于随ActiveMQ5.x分发的OpenWire JMS客户机。从URL中选择哪个连接器由连接负载平衡策略决定,如文档中所述。默认的连接负载平衡策略是org.apache.activemq.artemis.api.core.client.loadBalance.RoundRobinConnectionLoadBalancingPolicy,它将从URL列表中选择一个随机连接器,然后循环连接。还有其他策略可用,如果它们中没有一个给出您想要的行为,那么您可以实现自己的行为。

也就是说,听起来您真正想要/需要的是两对代理,其中每对由一个live和一个backup组成。这样,如果live broker失败,那么所有客户端都可以故障转移到备份,您就不必处理您试图实现的“假”故障转移功能的任何其他复杂性。

此外,由于您使用的是Spring的jmstemplate,您应该注意到它使用的一些众所周知的反模式,这些反模式可能会以负面的方式显著影响性能。

 类似资料:
  • 我试图在docker群中创建一个Redis集群。我正在使用bitnami-redis-docker图像创建容器。在阅读bitnami文档时,他们总是建议使用1个主节点,而不是阅读Redis文档,后者规定至少应该有3个主节点,这就是为什么我不知道哪个是正确的。假定所有bitnami slave默认为只读,如果我在一个swarm leader节点中只设置一个master,并且如果失败,我相信senti

  • 问题内容: 在我的JMS应用程序上,我们在生产者上使用临时队列,以便能够接收来自消费者应用程序的回复。 我在这个线程上遇到了与我完全相同的问题:http : //activemq.2283324.n4.nabble.com/jira- Created-AMQ-3336-Temporary-Destination-errors-on-HA-failover-in -broker- network-w

  • 为什么我们不再需要它们在集群中?netty-acceptor到底代表什么?

  • 问题内容: 在JSF 2.0.9,Weblogic 10.3.4上运行。我们现在在生产环境中运行JSF,但是会话复制遇到了一些问题并进行了故障转移。我们正在为我们的bean使用viewscope,我已经确保它们是可序列化的/瞬态的,并且瞬态变量实际上是无状态的。但是,会话故障转移不起作用。我已经进行了广泛的测试,并设法通过在web.xml中设置以下参数来使其正常工作 如果设置为,则在故障转移时会收

  • null 当我使用Ctrl-C停止活动服务器时,从服务器报告的而断开连接,这是正确的,但是备份服务器没有更改其状态,也没有侦听端口61617。那么我在配置中做错了什么呢? 实时服务器配置: 备份服务器配置: