ActiveMQ HA在故障转移时

时间:2018-11-29 15:57:00

标签: activemq high-availability

ActiveMQ群集(主从)在故障转移模式下是否提供高可用性? 我正在发布有关主题的消息,但是当我杀死活动节点并且使用者连接到另一个节点时,它将丢失几条消息。 我只需要主题模式,因为我需要具有同时使用消息的不同容器。我们对持久性消息和订阅进行了测试,但遇到了同样的问题。

如果ActiveMQ不支持此功能,是否还有其他代理可以做到这一点?

我们已经使用Spring boot开发发件人和消费者应用。

SENDER:

要发送消息,我们使用了API REST,该REST向一个主题发送了5000条消息。如果某些convertAndSend失败(ActiveMQ节点1被杀死),我们将重试直到故障转移。

这是我的发送者类:

@RestController
public class RestApiController {

    @Autowired
    private JmsTemplate jmsTemplate;

    @RequestMapping(value = "/produce")
    public String produce() {
        String result = "Done";
        for (int i = 0; i < 5000; i++) {
            boolean repetir = true;
            while (repetir) {
                try {
                    jmsTemplate.convertAndSend("TestTopic", "Message " + i);
                    repetir = false;
                    result = "Done";
                } catch (JmsException e) {
                    e.printStackTrace();
                    result = "ERROR";
                }
            }
        }
        return result;
    }
}

这是发件人的application.properties:

spring.activemq.broker-url=failover:(tcp://172.18.13.45:61616,tcp://172.18.13.45:61626)?initialReconnectDelay=1&backup=true spring.activemq.user=admin
spring.activemq.password=admin 
spring.jms.pub-sub-domain=true 
server.port=8081

消费者:

这是我的侦听器类:

@Service
public class ContactTransactionReceiver {

    @JmsListener(destination = "TestTopic")
    public void receiveMessageSendMessage(Message message) throws Exception {
        System.out.println(((TextMessage) message).getText());
    }
}

这是使用者的application.properties:

spring.activemq.broker-url=failover:(tcp://172.18.13.45:61616,tcp://172.18.13.45:61626)?initialReconnectDelay=1&backup=true
spring.activemq.user=admin
spring.activemq.password=admin
spring.jms.pub-sub-domain=true
server.port=8082

ACTIVEMQ NODE 1

我们已在针对HA的activemq.xml中包含此配置,该配置引用了node2:

    <persistenceAdapter>
        <kahaDB directory="${activemq.data}/kahadb"/>
    </persistenceAdapter>
    <networkConnectors>
        <networkConnector uri="static:(tcp://172.18.13.45:61616,tcp://172.18.13.45:61626)" />
    </networkConnectors>

我们已经证明了主从:

    <persistenceAdapter>
        <kahaDB directory="${activemq.data}/kahadb"/>
    </persistenceAdapter>
    <networkConnectors>
        <networkConnector uri="masterslave:(tcp://172.18.13.45:61616,tcp://172.18.13.45:61626)" />
    </networkConnectors>

ACTIVEMQ NODE 2

我们已在针对HA的activemq.xml中包含此配置,该配置引用了node2:

    <persistenceAdapter>
        <kahaDB directory="${activemq.data}/kahadb"/>
    </persistenceAdapter>
    <networkConnectors>
        <networkConnector uri="static:(tcp://172.18.13.45:61626,tcp://172.18.13.45:61616)" />
    </networkConnectors>

我们已经证明了主从:

    <persistenceAdapter>
        <kahaDB directory="${activemq.data}/kahadb"/>
    </persistenceAdapter>
    <networkConnectors>
        <networkConnector uri="masterslave:(tcp://172.18.13.45:61626,tcp://172.18.13.45:61616)" />
    </networkConnectors>

您可以在以下位置找到完整的代码和ActiveMQ配置文件:

https://github.com/PedroRamirezTOR/ActiveMQ-HA-Sender-Consumer.git

提前谢谢!

2 个答案:

答案 0 :(得分:0)

ActiveMQ 5.x确实通过主从配置支持高可用性。有关更多详细信息,请参见the documentation

答案 1 :(得分:0)

我在您的xml中注意到,主服务器和从服务器都在引用本地KashaDB。我相信要实现真正的HA故障转移,您需要引用共享的网络驱动器。

http://activemq.apache.org/shared-file-system-master-slave

<persistenceAdapter>
  <kahaDB directory="/sharedFileSystem/sharedBrokerData"/>
</persistenceAdapter>