Проблема с несколькими потребителями ActiveMQ

#glassfish #activemq

#glassfish #activemq

Вопрос:

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

Я несколько раз замечал, что по неизвестной причине один из (случайных) экземпляров glassfish переключается на activemq02, а оставшиеся три экземпляра по-прежнему будут подключены к activemq01, даже если activemq01 не был отключен, и все экземпляры glassfish должны были прослушивать activemq01.

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

Кто-нибудь сталкивался с такими же или похожими проблемами? Любая помощь / совет приветствуется.

Вот мои конфигурации activemq :

activemq01 :

http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsdhttp://activemq.apache.org/schema/core http://activemq.apache.org/schema/core/activemq-core.xsd «>

файл: ${activemq.base}/conf/credentials.properties

 <managementContext>
  <managementContext connectorPort="1093" createConnector="true"/>
</managementContext>

<networkConnectors>
  <networkConnector name="amq-prod" uri="static://(tcp://127.0.0.1:61616,tcp://192.168.0.167:61616)" />
</networkConnectors>


<persistenceAdapter>
  <kahaDB directory="${activemq.base}/data/kahadb"/>
</persistenceAdapter>

<plugins>
  <loggingBrokerPlugin logAll="false" logConnectionEvents="true"/>
</plugins>


<systemUsage>
  <systemUsage>
    <memoryUsage>
      <memoryUsage limit="2048 mb"/>
    </memoryUsage>
    <storeUsage>
      <storeUsage limit="2 gb" name="prod"/>
    </storeUsage>
    <tempUsage>
      <tempUsage limit="2000 mb"/>
    </tempUsage>
  </systemUsage>
</systemUsage>

<transportConnectors>
  <transportConnector name="openwire" uri="tcp://0.0.0.0:61616" updateClusterClients="true" />
</transportConnectors>
  

#

activeMQ02:

http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsdhttp://activemq.apache.org/schema/core http://activemq.apache.org/schema/core/activemq-core.xsd «>

файл: ${activemq.base}/conf/credentials.properties

 <managementContext>
  <managementContext connectorPort="1093" createConnector="true"/>
</managementContext>

<networkConnectors>
  <networkConnector name="amq-prod" uri="static://(tcp://127.0.0.1:61616,tcp://192.168.0.166:61616)"  />
</networkConnectors>


<persistenceAdapter>
  <kahaDB directory="${activemq.base}/data/kahadb"/>
</persistenceAdapter>
  

 <systemUsage>
  <systemUsage>
    <memoryUsage>
      <memoryUsage limit="2048 mb"/>
    </memoryUsage>
    <storeUsage>
      <storeUsage limit="2 gb" name="prod"/>
    </storeUsage>
    <tempUsage>
      <tempUsage limit="2000 mb"/>
    </tempUsage>
  </systemUsage>
</systemUsage>

<transportConnectors>
  <transportConnector name="openwire" uri="tcp://0.0.0.0:61616" updateClusterClients="true" />
</transportConnectors>
  

версия ActiveMQ — 5.4.1

Ответ №1:

Должен ли ваш тег networkConnector быть определен следующим образом:

конфигурация acticemq01:

  <networkConnector
         name="amq1-nc" 
         uri="static:(failover:(tcp://192.168.0.167:61616))" 
         networkTTL="2" 
         duplex="true"
         dynamicOnly="true" 
  />
  

конфигурация acticemq02:

  <networkConnector
         name="amq2-nc" 
         uri="static:(failover:(tcp://192.168.0.166:61616))" 
         networkTTL="2" 
         duplex="true"
         dynamicOnly="true" 
  />
  

И в ваших потребителях используйте URL-адрес поставщика JMS, подобный этому:

 failover:(tcp://192.168.0.166:61616,tcp://192.168.0.167:61616)?randomize=falseamp;timeout=5000
  

Приведенный выше URL-адрес для отработки отказа всегда будет подключаться к брокеру acticemq01, если он доступен. Если acticemq01 выйдет из строя, он автоматически переключится на брокера acticemq02. Также тайм-аут = 5000 гарантирует, что потребитель вернет ошибку через 5 секунд при попытке подключиться к любому из двух брокеров.

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

1. Спасибо, Анубхава! Проблема с этой конфигурацией заключается в том, что когда я останавливаю activemq01, соединения прерываются на activemq02, но когда я попытался запустить activemq01 обратно и остановил activemq02, потребители не выполнили возврат к activemq01.

2. моя очередь ожидания продолжает накапливаться, и я потратил много времени на изучение и настройку настроек, и не уверен, что происходит. Это происходит ТОЛЬКО с одной из очередей. Просто чтобы дать вам немного информации, на случай, если вы сможете посоветовать по улучшению производительности с помощью некоторых изменений конфигурации :

3. производитель помещает объекты сообщений в очередь, которая содержит несколько десятков отдельных контактов, затем потребители (4) прослушивают эту очередь и выбирают сообщение (объект), анализируют и доставляют удаленному поставщику, по одному контакту за раз. Известно, что производительность доставки от поставщика низкая, как вы думаете, если я увеличу размер предварительной выборки в этой очереди (в настоящее время равен 100), это исправит проблему, и сообщения не будут накапливаться в очереди ожидания? Заранее благодарю вас

4. Желательно, чтобы, если вы знаете, что конкретный потребитель будет медленным, установите для него размер предварительной выборки на что-то меньшее. Для вашего конкретного способа обработки больших ожидающих сообщений я бы посоветовал вам взглянуть на эту страницу: activemq.apache.org/slow-consumer-handling.html

5. Вот процесс: одно сообщение в очереди может содержать 100 контактов, поэтому один из экземпляров glassfish заберет сообщение из очереди, затем проанализирует сообщение объекта и отправит каждому контакту по отдельности, что занимает около 4 минут. Насколько я понимаю, поскольку activemq ожидает подтверждения раньше, чем через 4 минуты, он помечает их как «повторную доставку» и помещает в очередь ожидания. Есть ли способ увеличить это время в activemq для этой конкретной очереди, чтобы она ожидала подтверждения около 4 минут? или даже вообще не ждать подтверждения, просто запустить и забыть?