Как заставить подключение ActiveMQ случайным образом выбрать брокера для нового потребителя? - PullRequest
0 голосов
/ 16 марта 2011

Я использую следующий URL для создания ActiveMQConnactionFactory:

failover:(tcp://server1:port,tcp://server2:port,tcp://server2:port)

Что я хочу сделать, это создать несколько потребителей сообщений из этой сети брокеров.Следующий код не является реальным кодом, но он помогает понять, как я это делаю:

ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("BROKER_URL");
connection = connectionFactory.createConnection();
connection.start();

for (int i=0; i<10; i++) {
session = connection.createSession(false, Session.CLIENT_ACKNOWLEDGE);
Destination queue = consumerSession.createQueue("QUEUE_NAME");
consumer = consumerSession.createConsumer(queue);
consumer.setMessageListener(new MessageListener());
}

Проблема в том, что все потребители будут подключены к одному случайно выбранному брокеру.Но я хочу, чтобы они были сбалансированы по сети брокеров.

Я полагаю, что это можно сделать путем создания нескольких соединений с фабрикой.

Но каковы наилучшие методы для этого?И это хорошая вещь, которую я хочу?:)

1 Ответ

0 голосов
/ 16 марта 2011

На самом деле потребитель не будет подключен к случайно выбранному брокеру.

Соединение - это часть, которая подключается к брокеру.С предоставленной вами строкой соединения у вас будет ОДНО соединение, связанное с ОДНОМ случайно выбранным брокером.У всех потребителей есть свои собственные сеансы, но они будут использовать одно и то же ОДНО соединение с этим ОДНЫМ посредником.

Единственный известный мне параметр - это то, что вы можете отключить случайное поведение протокола отработки отказа, установив ?randomize=false вСтрока подключения.Это будет означать, что ваше соединение сначала будет пытаться сначала, затем вторым, затем третьим и т. Д.

Но для достижения ваших требований.Я бы заставил каждого потребителя иметь свою собственную связь.Это, вместе с функцией рандомизации в протоколе переключения при отказе, может сбалансировать нагрузку потребителей;но не на самом деле, там нет никакого интеллекта и он просто "рандомизирует" брокера, к которому он подключается.

Это означает, что я бы сделал следующее (из вашего кода)

ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("BROKER_URL");

for (int i=0; i<10; i++) {

connection = connectionFactory.createConnection();
connection.start();
session = connection.createSession(false, Session.CLIENT_ACKNOWLEDGE);
Destination queue = consumerSession.createQueue("QUEUE_NAME");
consumer = consumerSession.createConsumer(queue);
consumer.setMessageListener(new MessageListener());

}

Таким образом, у каждого потребителя будет свое собственное соединение с «брокером» вашей строки аварийного соединения

ОБНОВЛЕНО ПОСЛЕ ИЗМЕНЕНИЯ ВОПРОСА:

Если вы хотитеЧтобы позволить ActiveMQ случайным образом выбрать брокера для каждого потребителя, вышеупомянутое решение - это путь.

Лучшей практикой будет размещение ваших потребителей и производителей как можно ближе друг к другу.Для этого я бы порекомендовал снизить приоритет потребителя сети, чтобы местный потребитель и производитель имели наивысший приоритет.Только если локальный потребитель не находится в режиме ожидания, он будет распределяться дальше по сети другим потребителям.

В дополнение к этому, будет хорошей идеей, если операция на стороне потребителя будет продолжительной для установки более низкого уровня.значение предварительной выборки, чтобы сообщения балансировали нагрузку в сети брокеров, а не один потребитель перехватывал 1000 сообщений, в то время как другие потребители простаивают.

...