我正在使用ActiveMQ Artemis 2.10和JMS Client 1.1客户端。
如果我在地址上使用了多播路由类型并需要持久订阅,那么如何在使用方实现负载平衡?
使用ActiveMQ 5,它将是virtual destinations。
尚不清楚在消耗某个主题的持久订阅时如何使用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 Client 2.0,它允许您创建Shared Durable订阅,这是正确的吗?
有第三种选择吗?
答案 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
创建)。