Загрузка балансировки потребителей по темам на ActiveMQ Artemis - PullRequest
0 голосов
/ 03 ноября 2019

Я использую ActiveMQ Artemis 2.10 и клиент JMS Client 1.1.

Если я использовал тип многоадресной маршрутизации в своем адресе и мне нужны надежные подписки, как мне добиться балансировки нагрузки на стороне потребителя?

Publish-Subscribe

С ActiveMQ 5 это будет виртуальных назначений .

Неясно, как балансировка нагрузки на стороне потребителя могла быдостигаться с помощью ActiveMQ Artemis 7.2 и клиента JMS Client 1.1 при использовании длительных подписок на тему.

В приведенном выше примере:

Каждый из потребителей будет устанавливать clientId (client123 иclient456) в примере, но это будет означать, что может быть только один экземпляр client123, потребляющий из client123.topic.foo.

В настоящее время я понимаю, что клиент ActiveMQ Artemis 2.10 и JMS Client 1.1 подразумевает, что у вас не может быть балансировки нагрузки по темам, это будет правильно?

Единственным вариантом, по-видимому, являются ActiveMQ Artemis 2.10 и JMS. Клиент 2.0, который позволяет создавать подписки Shared Durable, будет ли это правильно?

Есть ли третий вариант?

1 Ответ

0 голосов
/ 03 ноября 2019

Насколько я понимаю, клиенты Active MQ Artemis 7.2 и JMS Client 1.1 подразумевают, что у вас не может быть балансировки нагрузки по темам, это будет правильно?

Нет.

Единственным вариантом, по-видимому, являются Active MQ Artemis 7.2 и JMS Client 2.0, который позволяет создавать подписки Shared Durable, это будет правильно?

Нет.

Есть ли 3-й вариант?

Да. Вы можете использовать полное имя очереди долгосрочной подписки с потребителем JMS. Как отмечено в документе сопоставления JMS-к-ядру , тема JMS сопоставляется с основным адресом, а подписка по этому разделу JMS сопоставляется с основной очередью по основному адресу. В случае долговременной подписки JMS имя этой очереди следует шаблону ". ". Вот пример кода для демонстрации:

ConnectionFactory cf = new ActiveMQConnectionFactory("tcp://127.0.0.1:61616");
Connection connection1 = cf.createConnection();
connection1.setClientID("myClientID");
Session session1 = connection1.createSession(false, Session.AUTO_ACKNOWLEDGE);
Topic topic = new ActiveMQTopic("myTopic");
MessageConsumer consumer1 = session1.createDurableSubscriber(topic, "mySubscriptionName");

Connection connection2 = cf.createConnection();
Session session2 = connection2.createSession();
Destination destination = new ActiveMQQueue("myTopic::myClientID.mySubscriptionName");
MessageConsumer consumer2 = session2.createConsumer(destination);

// Send 2 messages
MessageProducer producer = session1.createProducer(topic);
producer.send(session1.createMessage());
producer.send(session1.createMessage());
producer.close();

// Receive the first message with the first consumer
connection1.start();
Message message1 = consumer1.receive();
consumer1.close();

// Receive the second message with the second consumer
connection2.start();
Message message2 = consumer2.receive();
consumer2.close();

Скажем по-другому ...

Поскольку JMS 1.1 явно не разрешает общие долговременные подписки, вы не можете горизонтально масштабировать приложения, используяcreateDurableSubscriber на ту же тему с тем же идентификатором клиента и именем подписки. Однако вы можете масштабировать по горизонтали, если одно приложение использует createDurableSubscriber, а все остальные просто потребляют напрямую из базовой очереди подписки, используя свое «полное имя очереди» (которое определяется на основе идентификатора клиента и имени подписки, использованных при его первом создании). используя createDurableSubscriber).

...