Распространение сообщений на ArtemisMQ 2.x не работает

Я хотел бы включить перераспределение сообщений в моем 2-узловом кластере со статическими хостами. Но вроде не работает.

1) У меня есть 10 производителей, которые записывают в очередь MyTestQueue на узле 1 (но нет потребителей).
2) У меня есть 1 потребитель на узле 2 (но нет производителей), который принимает сообщения от узла 2.

Я ожидаю, что узел 1 перераспределит сообщения узлу 2, где существует потребитель, но этого не происходит. Количество сообщений на узле 1 по-прежнему равно количеству сообщений, отправленных узлу 1.

В моем broker.xml есть следующая конфигурация, которая устанавливает для forward-when-no-consumers значение false. Я также установил redistribution-delay равным нулю.

<jms xmlns="urn:activemq:jms">
    <queue name="MyTestQueue"/>
</jms>
...
<cluster-connections>
      <cluster-connection name="my-test-cluster">
           <address>jms</address>
           <connector-ref>server0-connector</connector-ref>
            <retry-interval>500</retry-interval>
            <use-duplicate-detection>true</use-duplicate-detection>
            <forward-when-no-consumers>false</forward-when-no-consumers>
            <message-load-balancing>ON_DEMAND</message-load-balancing>
            <max-hops>1</max-hops>
            <confirmation-window-size>1024</confirmation-window-size>
            <static-connectors>
                <connector-ref>server1-connector</connector-ref>
            </static-connectors>
        </cluster-connection>
    </cluster-connections>
    ...
    <address-settings>
         <address-setting match="#">
             <redelivery-delay>5000</redelivery-delay>
             <redelivery-delay-multiplier>3</redelivery-delay-multiplier>
             <max-redelivery-delay>10000</max-redelivery-delay>
             <max-delivery-attempts>10</max-delivery-attempts>
             <max-size-bytes>104857600</max-size-bytes>
             <page-size-bytes>10485760</page-size-bytes>
             <address-full-policy>PAGE</address-full-policy>
             <redistribution-delay>0</redistribution-delay>
        </address-setting>
    </address-settings>

Как я могу заставить работать перераспределение сообщений?


person Rox    schedule 15.08.2017    source источник


Ответы (3)


Это может быть связано с известной проблемой. Бывает ситуация, когда брокеру не удается сбалансировать нагрузку сообщений, если они не содержат поля свойств приложения.

Не могли бы вы попробовать это?

person otavio021    schedule 16.08.2017
comment
Спасибо! Не могли бы вы указать, какие свойства приложения я должен установить и где? На клиенте? В broker.xml? - person Rox; 16.08.2017
comment
@Rox Задайте некоторые свойства приложения для отправляемых вами сообщений. Все должно работать. Только не отправляйте сообщение полностью без каких-либо свойств приложения. - person user7610; 16.08.2017
comment
@ user7610: Понятно! Я попытаюсь установить свойство строки в сообщении и посмотреть, работает ли оно. Вернусь сюда с результатом. - person Rox; 16.08.2017
comment
@ user7610: Сейчас я протестировал и, к сожалению, у меня не сработало. :-( Сообщения по-прежнему не перераспределяются узлу с потребителями. - person Rox; 16.08.2017
comment
Можете ли вы предоставить дополнительные сведения о своей конфигурации и шагах, которые вы предприняли для настройки кластера? Например, вы создали очередь на всех узлах? Я сравнил вашу конфигурацию с моей, и моя значительно проще. В моем случае я настроил его через командную строку. - person otavio021; 16.08.2017
comment
@ user7610: Да, очередь существует на обоих узлах. Я также полностью изучил их пример по адресу: github.com/apache/activemq-artemis/tree/master/examples/, и иногда это работает, а иногда нет. У меня не получится, если я отправлю сообщения первому брокеру и попытаюсь использовать их на втором. Но это сработает, если я отправлю их первому брокеру, а затем закрою второго, но это не то, что я хочу. Я хочу получать сообщения от второго брокера только после их отправки на первый узел брокера. - person Rox; 22.08.2017
comment
Я имею в виду, что это работает только в том случае, если у обоих брокеров есть потребители, а один из потребителей закрывается. Затем сообщения будут распространяться. Но если исходное состояние после запуска кластера Artemis и моего приложения таково, что первый узел имеет только производителя, а второй - потребителя, это не работает. Перераспределение сообщений работает, только если сеанс был закрыт ранее. - person Rox; 22.08.2017
comment
@Rox Это похоже на ошибку. Не могли бы вы сообщить об этом в систему отслеживания проблем Artemis по адресу issues.apache.org/jira/projects/ АРТЕМИДА? (Требуется создание учетной записи в Jira). Если нет, я или, может быть, otavio021 могу попробовать заполнить его, когда у нас будет время. - person user7610; 22.08.2017
comment
Привет, @Rox. Не могли бы вы объяснить, какие свойства вы добавили, чтобы заставить его работать? У меня такая же проблема, репликация пользователя моего кластера (2 брокера) размещена, но она не перераспределяет сообщения другому брокеру - person user3611168; 04.12.2019

Пара вещей ...

  • Какую версию Artemis вы используете? Вы пробовали воспроизвести это с версией 2.2.0?
  • Какой тип клиента вы используете (например, JMS, AMQP, STOMP и т. Д.)?
  • У вас есть воспроизводимый тестовый пример (например, модифицированная версия одного из примеров, поставляемых с Artemis)?
  • Элемент конфигурации ‹forward-when-no-consumers> недействителен в Artemis (хотя он был в более старых версиях HornetQ).
person Justin Bertram    schedule 01.09.2017

Удалите <address>jms</address> из конфигурации подключения кластера - каждое подключение кластера применяется только к адресам, которые соответствуют указанному адресу. И убедитесь, что вы используете совместимый клиент, потому что сообщения от клиентов 1.x к кластеру 2.x теряются при балансировке нагрузки на узлы с соответствующими потребителями.

Вот официальный рабочий пример Конфигурация ActiveMQ Artemis с симметричным кластером, балансировкой нагрузки по требованию и перераспределением сообщений

person Jarek Przygódzki    schedule 31.01.2018