Статьи

В ActiveMQ 5.9 появился новый способ прервать медленных потребителей.


Тема о том, как бороться с медленным потребителем в
ActiveMQ , время от времени появляется в списке рассылки. В текущих выпусках есть
класс
стратегии, который позволяет вам настраивать интервал времени, после которого медленный потребитель закрывается (некоторую хорошую документацию можно найти
здесь ). AbortSlowConsumerStrategy обнаруживает, что потребитель работает медленно, просматривая его буфер предварительной выборки и проверяя, заполнен ли он слишком долго. Когда пользователь прерван, сообщения, которые были в его буфере предварительной выборки, могут затем быть отправлены другим потребителям в том же месте назначения.

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

Чтобы решить проблему медленных потребителей с небольшими значениями предварительной выборки, мы ввели AbortSlowAckConsumerStrategy. Эта стратегия работает путем проверки времени, прошедшего с момента, когда потребитель последний раз подтверждал сообщение, в зависимости от времени, когда у потребителя был полный буфер предварительной выборки. Стратегия будет опрашивать всех потребителей назначения с настраиваемой скоростью, чтобы определить, является ли потребитель медленным, и соответствует ли потребитель настроенным критериям для прерывания, тогда ему будет предоставлена ​​загрузка, и все предварительно выбранные сообщения будут отправлены повторно. 

AbortSlowAckConsumerStrategy настраивается в файле конфигурации XML следующим образом:

<broker ... >
  ...
  <destinationPolicy>
    <policyMap>
      <policyEntries>
        <policyEntry topic=">" >
          <slowConsumerStrategy>
            <abortSlowConsumerStrategy />
          </slowConsumerStrategy>
        </policyEntry>
      </policyEntries>
    </policyMap>
  </destinationPolicy>
  ...
</broker>

Эта конфигурация добавляет AbortSlowAckConsumerStrategy с параметрами по умолчанию и применяет его только к потребителям тем. Для очередей вам просто нужно заменить слово «тема» на «очередь» в записи политики.

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

Таблица 2. Настройки для стратегии прерывания медленного потребления
атрибут По умолчанию Описание
maxTimeSinceLastAck 30000 Задает время, которое должно пройти с момента подтверждения последнего сообщения, прежде чем потребитель будет помечен как медленный.
ignoreIdleConsumers true Указывает, применяется ли время с момента последнего подтверждения к потребителю, у которого нет отправленных сообщений. Если установлено значение false, эту стратегию можно использовать для отмены любого потребителя по истечении времени с момента последнего интервала подтверждения.
maxSlowCount -1 Указывает, сколько раз потребитель может считаться медленным перед тем, как его прервать. -1указывает, что потребитель может считаться медленным бесконечное количество раз.
maxSlowDuration 30000 Задает максимальное количество времени (в миллисекундах), в течение которого потребитель может непрерывно замедляться перед тем, как его прервать.
checkPeriod 30000 Определяет в миллисекундах время между проверками для медленных потребителей.
abortConnection false Указывает, заставляет ли посредник закрывать соединение с потребителем. Значение по умолчанию указывает, что брокер отправит сообщение потребителю с просьбой закрыть его соединение. trueуказывает, что брокер автоматически закроет соединение потребителя.

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

Давайте рассмотрим пример того, как прервать любого получателя темы, который не подтвердил сообщение за последние 60 секунд:

<broker ... >
  ...
  <destinationPolicy>
    <policyMap>
      <policyEntries>
        <policyEntry topic=">" >
          <slowConsumerStrategy>
            <abortSlowConsumerStrategy ignoreIdleConsumers="false" maxTimeSinceLastAck="60000" />
          </slowConsumerStrategy>
        </policyEntry>
      </policyEntries>
    </policyMap>
  </destinationPolicy>
  ...
</broker>