Поддержка 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 уже используется в другом месте).
1 ответ
Вы действительно провели какое-либо тестирование, чтобы увидеть, работают ли ваши потребители с предварительной выборкой 1, как ожидалось?
Внутренние компоненты ActiveMQ не основаны на AMQP, поэтому, даже если подключен потребитель AMQP, все не всегда будет выглядеть так, как вы этого хотите. Внутренний потребитель ActiveMQ для клиентского соединения AMQP по умолчанию имеет значение 100, однако отправка сообщений клиенту по-прежнему ограничена текущим окном потока, которое установлено на удаленном конце. Если клиент QPid ограничивает кредит ссылок одним, когда вы устанавливаете значение предварительной выборки, то брокер будет отправлять только одно сообщение.
Единственное предостережение здесь заключается в том, что каждая подписка может предварительно выбирать на стороне брокера, но в конечном итоге будет выравниваться среди потребителей, основываясь на том факте, что брокер будет выполнять круговую рассылку по мере добавления большего числа потребителей.
Поддержка AMQP в ActiveMQ все еще находится на стадии становления, поэтому вы можете погрузиться в нее и попробовать ее улучшить.