ActiveMQ Artemis $.artemis.internal.sf иногда создает сообщения

В случайное время очередь моста кластера $.artemis.internal.sf накапливает сообщения, как будто мост завис. Другие очереди с удовольствием принимают сообщения и потребляют их, как и ожидалось, даже под нагрузкой.

В производстве установка следующая:

  • Версия ActiveMQ Artemis — 2.22.0, работающая на Java 11 (не наблюдается чрезмерного GC или нет во время сборки).
  • 2 «уровня» кластеров, скажем, один для «поверхности» и один для «глубокого» материала. 2 виртуальные машины vmware для каждого уровня в одном и том же теге безопасности / vlan (у меня нет доступа к этому, и изменить его может быть невозможно).
  • «Поверхностные» виртуальные машины — это artm и arts, «глубокие» виртуальные машины — это artim и artis.
  • Каждый из этих уровней содержит 3 кластера (например, кластер-1, кластер-2 и кластер-3, настоящие имеют разные имена, но я не могу их разглашать) с 2 ведущими и 2 подчиненными в каждом, сгруппированными в пары masterA с slaveA и masterB с slaveB (используя имя группы в ha-policy
artm has masterA-S1, masterA-S2, masterA-S3 and slaveB-S1, slaveB-S2, slaveB-S3
arts has masterB-S1, masterB-S2, masterB-S3 and slaveA-S1, slaveA-S2, slaveA-S3
artim has masterA-D1, masterA-D2, masterA-D3 and slaveB-D1, slaveB-D2, slaveB-D3
artis has masterB-D1, masterB-D2, masterB-D3 and slaveA-D1, slaveA-D2, slaveA-D3
  • Порты адаптированы, чтобы избежать коллизий, и все работает хорошо.
  • В «глубоких» кластерах у нас есть приложения, которые могут иметь только одного потребителя, поэтому мы используем перераспределение сообщений, поскольку мы точно не знаем, к какому из двух мастеров он будет подключаться (connectionFactories и providerUrl установлены нормально).
  • Конфигурация 3 кластеров на данном уровне аналогична.

Соединения кластера следующие

мастерA-D1

<cluster-connections>
   <cluster-connection name = "cluster-D1">
      <connector-ref>connector-D1-master-a</connector-ref>
      <check-period>1000</check-period>
      <connection-ttl>20001</connection-ttl>
      <initial-connect-attempts>-1</initial-connect-attempts>
      <reconnect-attempts>1</reconnect-attempts>
      <use-duplicate-detection>true</use-duplicate-detection>
      <message-load-balancing>ON_DEMAND</message-load-balancing>
      <max-hops>1</max-hops>
      <notification-interval>2000</notification-interval>
      <notification-attempts>2</notification-attempts>
         <static-connectors>
            <connector-ref>connector-D1-slave-a</connector-ref>
            <connector-ref>connector-D1-master-b</connector-ref>
            <connector-ref>connector-D1-slave-b</connector-ref>
         </static-connectors>
   </cluster-connection>
</cluster-connections>

masterB-D1

<cluster-connections>
   <cluster-connection name = "cluster-D1">
      <connector-ref>connector-D1-master-b</connector-ref>
      <check-period>1000</check-period>
      <connection-ttl>20001</connection-ttl>
      <initial-connect-attempts>-1</initial-connect-attempts>
      <reconnect-attempts>1</reconnect-attempts>
      <use-duplicate-detection>true</use-duplicate-detection>
      <message-load-balancing>ON_DEMAND</message-load-balancing>
      <max-hops>1</max-hops>
      <notification-interval>2000</notification-interval>
      <notification-attempts>2</notification-attempts>
      <static-connectors>
         <connector-ref>connector-D1-slave-b</connector-ref>
         <connector-ref>connector-D1-master-a</connector-ref>
         <connector-ref>connector-D1-slave-a</connector-ref>
      </static-connectors>
   </cluster-connection>
</cluster-connections>

Уровень поверхности имеет в общей сложности около 400 очередей (любая передача) и около 450 для глубокого рычага (также любая передача).

Мост между masterA и masterB подключен правильно. Логи это подтверждают.

Ежедневно вся система обрабатывает около 8-9 миллионов сообщений.

Мы попытались зарегистрировать класс org.apache.activemq.artemis.core.server.cluster.impl.BridgeImpl в надежде увидеть "Bridge retrying connection # (что указывало бы на проблему с подключением и требовало увеличения количества попыток повторного подключения), но безуспешно.

Когда происходит наращивание, другие экземпляры по-прежнему ведут себя хорошо.

Мы просто устанавливаем повторные попытки подключения на -1 (неограниченное количество повторных попыток). Подождите и посмотрите, поможет ли это, но я сомневаюсь в этом.

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

Другой мост не настроен.

Наращивание не обязательно происходит ни при большой нагрузке, ни при большом времени безотказной работы. Мы видели наращивание с временем безотказной работы 7 дней, тогда как у нас есть другие экземпляры с временем безотказной работы 35+ дней без проблем и с таким же типом использования/трафика.

Мы не можем это воспроизвести. Вот почему я даю столько информации, сколько могу.

Я могу предоставить более подробную информацию, если требуется.

Я нашел это ТАКОЕ, но не уверен, что это связано. Хотя мы отправляем некоторые большие сообщения, это не то, что мы отправляем чаще всего, но я должен предположить, что с учетом нашей настройки мост может пересылать большие сообщения. У нас есть максимум 50 больших сообщений в день по всей системе.

пока нет, мы должны быть уверены, что проблема именно в этом (мы не можем так легко модифицировать производство ;)) Я заметил, что в документе указано -1 является значением по умолчанию для этого параметра. мы все еще должны установить его явно?

will 10.11.2022 16:49

ну, этот говорит 1 МБ activemq.apache.org/components/artemis/documentation/2.22.0/‌​… , а тот activemq.apache.org/components/artemis/documentation/2.22.0/‌​ … говорит -1... код, кажется, говорит -1 (org.apache.activemq.artemis.api.config.ActiveMQDefaultConfig‌guration#DEFAULT_BRI‌​DGE_PRODUCER_WINDOW_‌​SIZE равен -1). Я запутался :/

will 10.11.2022 17:13

извините, старая ссылка из моей IDE. -1 в 2.16, 1024 * 1024 в 2.22, поэтому мы действительно должны установить -1, но документ все еще смущает меня

will 10.11.2022 17:47

Спасибо за подтверждение. мы попробуем нашу предварительную подготовку и посмотрим, что мы можем сделать. я буду держать вас в курсе

will 10.11.2022 17:56

Любое обновление здесь?

Justin Bertram 14.11.2022 18:05
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
5
83
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я считаю, что здесь работает комбинация факторов.

По умолчанию producer-window-size на cluster-connection раньше было -1, но оно было изменено на 1048576 (т. е. 1 МБ) в 2.22.0 через ARTEMIS-3805 . Чтобы было ясно, глава «Кластеры» в документации была обновлена ​​​​с этим новым значением по умолчанию, но глава «Указатель конфигурации» была пропущена.

Однако, когда была выпущена версия 2.22.0, в управлении потоком была обнаружена неизвестная ошибка, которая могла привести к зависанию моста при перемещении больших сообщений с одного узла на другой. Эта ошибка не была решена до 2.26.0 через ARTEMIS-4003.

Поэтому я считаю, что вы можете решить эту проблему одним из двух способов:

  1. Оставайтесь на 2.22.0 и установите это на свой cluster-connection в broker.xml:
    <producer-window-size>-1<producer-window-size>
    
  2. Обновите до 2.26.0.

Я мог бы воспроизвести проблему в нашей среде preprod, используя несколько больших сообщений. применение вашей рекомендации относительно размера окна производителя решило проблему после перезапуска брокера, несмотря на то, что в журналах говорилось, что конфигурация была перезагружена. Мы планируем применить настройки на производстве сегодня вечером, но НАСТОЯТЕЛЬНО у нас есть работающее решение, так что большое спасибо!

will 15.11.2022 14:30

Другие вопросы по теме