在ActiveMQ Artemis上为主题的消费者平衡负载

时间:2019-11-03 00:54:07

标签: jms activemq-artemis jms-topic

我正在使用ActiveMQ Artemis 2.10和JMS Client 1.1客户端。

如果我在地址上使用了多播路由类型并需要持久订阅,那么如何在使用方实现负载平衡?

Publish-Subscribe

使用ActiveMQ 5,它将是virtual destinations

尚不清楚在消耗某个主题的持久订阅时如何使用ActiveMQ Artemis 7.2和JMS Client 1.1客户端实现消费者方面的负载平衡。

在上面的示例中:

在示例中,每个消费者都将设置clientId(client123client456),但这意味着client123中只有client123.topic.foo消费的一个实例}。

我目前的理解是ActiveMQ Artemis 2.10和JMS Client 1.1客户端意味着您无法在主题上进行负载平衡,这是正确的吗?

似乎唯一的选择是ActiveMQ Artemis 2.10和JMS Client 2.0,它允许您创建Shared Durable订阅,这是正确的吗?

有第三种选择吗?

1 个答案:

答案 0 :(得分:0)

  

我目前的理解是Active MQ Artemis 7.2和JMS Client 1.1客户端暗示您不能对主题进行负载平衡,这是正确的吗?

否。

  

唯一的选择似乎是Active MQ Artemis 7.2和JMS Client 2.0,它允许您创建Shared Durable订阅,对吗?

否。

  

有第三种选择吗?

是的。您可以将持久订阅的fully qualified queue name与JMS使用者一起使用。如JMS-to-core mapping document中所述,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创建)。