Поддержка AMQP 1.0 в ActiveMQ - невозможно установить предварительную выборку

Мы пытаемся построить систему очередей заданий поверх ActiveMQ 5.9.1. Мы используем поддержку AMQP 1.0 в activemq, а в настоящее время используем библиотеку qpid jms для клиентского кода.

Для системы очередей заданий жизненно важно, чтобы мы могли установить для предварительной выборки значение 1 - мы хотим, чтобы наши рабочие задания получали только одну задачу за раз, что соответствует шаблону конкурирующих потребителей. Библиотеки qpid поддерживают это, используя определение фабрики соединений, например:

connectionfactory.activemq-amqp-manager = amqp://{user}:{password}@{hostname}:{port}?clientid=job-manager&remote-host=default&max-prefetch=1

Однако ActiveMQ, похоже, полностью игнорирует это, потребитель отображается в консоли администратора activemq как имеющий предварительную выборку 100.

Копнув дальше, я нашел источник: org.apache.activemq.transport.amqp.AmqpProtocolConverter

который включает строку:

  consumerInfo.setPrefetchSize(100);

Означает ли это, что поддержка ActiveMQ протокола AMQP 1.0 фиксирует значение предварительной выборки 100 для всех клиентов? Ясно, что это очень неправильно. Какие у нас есть варианты? Мы могли бы переключиться на чистый JMS-клиент, но потеряли бы языковую совместимость. Или мы могли бы переключиться на RabbitMQ, что означает введение другого продукта для поддержки (ActiveMQ уже используется в другом месте).


person JonathanS    schedule 10.06.2014    source источник


Ответы (1)


Вы действительно проводили какое-либо тестирование, чтобы убедиться, что ваши потребители с предварительной выборкой 1 работают так, как ожидалось?

Внутреннее устройство ActiveMQ не основано на AMQP, поэтому, даже если потребитель AMQP подключен, все не всегда будет выглядеть именно так, как вам хотелось бы. Внутренний потребитель ActiveMQ для клиентского соединения AMQP по умолчанию имеет значение 100, однако отправка сообщений клиенту по-прежнему ограничена текущим окном потока, установленным на удаленном конце. Если клиент QPid ограничивает кредит ссылок на единицу, когда вы устанавливаете значение предварительной выборки, то брокер будет отправлять ему только одно сообщение.

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

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

person Tim Bish    schedule 10.06.2014
comment
Привет, да, мы проверили. Например - поставить в очередь 5 сообщений. Запустить воркера / потребителя - он получает первое сообщение и начинает работать над ним. Запустите второго рабочего / потребителя, он сидит и ничего не делает. Между тем, первый рабочий, когда он закончит работу с первым сообщением, получит второе, третье и т. Д. Выглядит довольно ясно, что клиент для первого рабочего фактически предварительно произвел предварительную выборку всех сообщений в очереди, несмотря на настройку max-prefetch. в qpid, в сочетании с контекстом администратора activeMQ, показывающим, что потребитель имеет предварительную выборку 100. - person JonathanS; 10.06.2014
comment
Да, это известное ограничение. Я проделал некоторую работу по поддержке AMQP, но у меня нет времени заняться этой областью. Взносы приветствуются. - person Tim Bish; 10.06.2014
comment
Спасибо за подтверждение. Посмотрим, насколько легко это можно исправить. - person JonathanS; 11.06.2014