Обеспечивает ли кластер ActiveMQ (ведущий-ведомый) высокую доступность в режиме отработки отказа?Я публикую сообщения по теме, но когда я уничтожаю активный узел и мой потребитель подключается к другому узлу, он теряет несколько сообщений.Мне нужен только режим темы, потому что мне нужно, чтобы разные модули принимали сообщения одновременно.Мы провели тестирование с надежными сообщениями и подписками с той же проблемой.
Если ActiveMQ не поддерживает эту функцию, есть ли другой брокер, который мог бы сделать это?
Мы использовали Springзагрузка для разработки приложений отправителя и потребителя.
SENDER:
Для отправки сообщений мы использовали API 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;
}
}
Это приложение отправителя. Свойства: * 10101 *
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());
}
}
Это приложение потребителя. Свойства:
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
Мывключили эту конфигурацию в activemq.xml для HA, который ссылается на узел 2:
<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
Мы включили эту конфигурацию в activemq.xml для HA, который ссылается на узел 2:
<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
Заранее спасибо!