Балансировка нагрузки ActimeMQ Artemis в JBoss EAP 7.2.0

#spring-boot #apache-camel #load-balancing #activemq-artemis #jboss-eap-7

#весенняя загрузка #apache-верблюд #балансировка нагрузки #activemq-artemis #jboss-eap-7

Вопрос:

Мы разрабатываем приложение с использованием Spring Boot и Apache Camel, которое считывает сообщение от ActiveMQ Artemis, выполняет некоторые преобразования и отправляет его в ActiveMQ Artemis. Наше приложение развертывается как war-файл в локальном JBoss EAP 7.2.0. Как исходное, так и целевое приложения являются удаленными для нашего приложения, и они также развернуты в JBoss EAP 7.2.0. Удаленные очереди, к которым подключается Camel, — это ActiveMQ Artemis, которые были созданы в JBoss и подключаются с использованием http-протокола удаленного доступа. Эти настройки работали, когда в каждом из приложений был только один узел.

Теперь мы создаем исходное и целевое приложения по 3 узла каждое (т. Е. Они будут развернуты на нескольких серверах JBoss). Для доступа к интерфейсу исходного и целевого приложений мы настраиваем и получаем к ним доступ через балансировщик нагрузки.

Можем ли мы настроить балансировщик нагрузки для доступа к исходным и целевым брокерам из уровня Camel? Будет 3 исходных и 3 целевых брокера. Или кластеризация брокеров — единственный вариант в этом случае?

Мы думаем о балансировке нагрузки между очередями, а не о кластеризации. Предположим, у нас есть три очереди q1 , q2 , и q3 с соответствующими брокерами b1 , b2 , и b3 . Я настрою URL-адрес балансировщика нагрузки на уровне Camel подобным http-remoting://<load-balancer-url>:<port> образом (так же, как мы делаем при балансировке нагрузки запросов HTTP API). Любое поступающее сообщение попадет в балансировщик нагрузки, и балансировщик нагрузки решит, в какую очередь направить сообщение.

Комментарии:

1. Да, правильно, Джастин

2. Мы думаем о балансировке нагрузки между очередями, а не о кластеризации, я сообщу вам о продукте балансировщика нагрузки, между тем хотел проверить осуществимость подхода, поскольку я не смог ничего найти в Интернете

3. Не совсем так, предположим, что у нас есть три очереди q1, q2 и q3 с соответствующими брокерами b1, b2 и b3. J настроит URL-адрес балансировщика нагрузки на уровне camel, например http-remoting://<url-адрес балансировщика нагрузки>:,<порт> (многое мы делаем при запросах API балансировки нагрузки). Любое поступающее сообщение попадет в балансировщик нагрузки, и он решит, в какую очередь направить сообщение

4. Хорошо, спасибо, посмотрю на это и вернусь. Да, я хочу сбалансировать нагрузку на уровне сообщений точно так же, как балансировщик нагрузки API.

5. Если я нажимаю URL-адрес (HTTP-запрос) из браузера или приложения, который является URL-адресом балансировщика нагрузки, запрос попадает в балансировщик нагрузки, и политика балансировки нагрузки (например, циклический перебор) определяет, в какую серверную службу будет отправлен запрос. Об этом я и говорил.

Ответ №1:

Соединения JMS отслеживают состояние. Когда клиент создает соединение, нет никаких указаний на очереди, в которые он будет отправлять сообщения. Балансировщик нагрузки должен будет направить соединение этого клиента либо b1 , b2 , либо b3 , и у него не будет возможности определить, куда оно должно идти. Балансировщик нагрузки, работающий с сообщениями, почти наверняка сможет балансировать только соединения, а не сообщения. Похоже, вместо этого вы хотите балансировку нагрузки на уровне сообщений. Возможно, вам следует изучить что-то вроде маршрутизатора отправки Qpid.

Обмен сообщениями не использует HTTP, поэтому использование балансировщика нагрузки HTTP, как вы делаете с вашими HTTP API (ами), не будет работать. Балансировщику нагрузки легко проверять заголовки HTTP и маршрутизировать запросы, тем более что HTTP не имеет состояния. Однако соединения для обмена сообщениями отслеживают состояние, а протоколы обычно немного сложнее, чем HTTP. Я не знаю ни одного балансировщика нагрузки, который будет работать так, как вы хотите для обмена сообщениями.

Ответ №2:

Вам нужно, чтобы ваш клиент не использовал топологию, вы можете сделать это с помощью «setUseTopologyForLoadBalancing» на вашем AMQConnectionFactory. Если вы получаете фабрику соединений из EAP, я думаю, что это настраивается на фабрике соединений начиная с EAP 7.3.

Комментарии:

1. Не могли бы вы подсказать мне, как это сделать? Нужно ли это определять в standalone-full.xml где мы определяем фабрики соединений? Предположим, что моя цель содержит три узла JBoss и, соответственно, три целевые очереди, нужно ли нам определять это на каждом из трех серверов JBoss standalone-full.xml ?

2. Да, в EAP 7.3 вы можете определить это в элементах (объединенных в пул) connection-factory docs.wildfly.org/20/wildscribe/subsystem/messaging-activemq /. … Но это может быть не то, что вам нужно, перечитывая отредактированный вопрос, поскольку это на случай, если вы не можете получить прямой доступ к узлам

3. Спасибо, я пройду через это, если это поможет