Как сбалансировать нагрузку ActiveMQ с постоянным сообщением

У меня есть промежуточное программное обеспечение на основе Apache Camel, которое выполняет транзакцию следующим образом:

from("amq:job-input")
  to("inOut:businessInvoker-one") // Into business processor
  to("inOut:businessInvoker-two")
  to("amq:job-out");

На данный момент работает отлично. Но я не могу масштабировать его, скажем, со 100 TPS до 500 TPS. я уже

  1. Увеличены настройки одновременных потребителей и использован пустой бизнес-процессор.
  2. Настроил JAVA_XMX и PERMGEN

для ускорения транзакции.

Согласно веб-консоли Active MQ, существует очень много сообщений, ожидающих обработки по сценарию 500TPS. Думаю, одним из решений является масштабирование ActiveMQ. Поэтому я хочу использовать несколько брокеров в кластере.

Согласно http://fuse.fusesource.org/mq/docs/mq-fabric.html (раздел «Топологии»), настройка ActiveMQ в режиме кластеризации подходит для непостоянного сообщения. ИМХО, правда не годится, ибо все работающие брокеры используют один и тот же файл хранилища. Но как насчет разделения файла хранилища? Теперь это возможно, верно?

Кто-нибудь может это объяснить? Если это невозможно, как лучше всего сбалансировать нагрузку постоянного сообщения?

Спасибо


person sancho21    schedule 12.08.2013    source источник


Ответы (5)


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

Создайте 2 пары ведущий-ведомый и настройте так называемые «сетевые разъемы» между двумя парами. Это удвоит вашу производительность без риска потери сообщений.

См. http://activemq.apache.org/networks-of-brokers.html

person Geert Schuring    schedule 10.03.2015
comment
Хорошо, это звучит как довольно надежное решение - person kensai; 14.04.2017

Этот ответ относится к версии вопроса до того, как были добавлены сведения о Camel.

Не сразу понятно, что именно вы хотите сбалансировать и зачем. Сообщения среди потребителей? Производители через брокеров? Какую проблему вы пытаетесь решить?

В общем, вам следует избегать использования сетей брокеров, если только вы не пытаетесь решить какой-то географический вариант использования, если у вас слишком много подключений для обработки сигнальным брокером или если один брокер (который может быть парой брокеров, настроенных в HA) не дает вам требуемой пропускной способности (в 90% случаев она будет).

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

ActiveMQ уже работает как своего рода балансировщик нагрузки, равномерно распределяя сообщения в циклическом режиме среди подписчиков в очереди. Итак, если у вас есть 2 подписчика в очереди и вы отправляете им поток сообщений A, B, C, D; один подписчик получит A и C, а другой — B и D.

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

person Jakub Korab    schedule 12.08.2013

Добавление потребителей может помочь в определенной степени (зависит от количества ядер/процессоров на вашем сервере). Добавление потоков за пределы того, что ваш «верблюжий сервер» использует весь доступный ЦП для бизнес-процессов, не имеет смысла и может быть продуктивным.

Вероятно, необходимо добавить больше машин ActiveMQ. Вы можете использовать «сеть» ActiveMQ для связи между экземплярами, которые имеют отдельные файлы сохранения. Должно быть просто добавить больше брокеров и поместить их в сеть.

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

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

person Petter Nordlander    schedule 14.08.2013

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

Если вы хотите сбалансировать нагрузку на свое постоянство, мы могли бы попытаться сделать это двумя способами:

  1. настройте несколько брокеров в режиме сетевого моста, затем отправляйте сообщения любому из них, а сообщения получателям — от более чем одного из них. он может балансировать нагрузку на брокеров и балансировать постоянство.
  2. переопределить persistenceAdapter и использовать промежуточное ПО для сегментирования базы данных (например, tddl:https://github.com/alibaba/tb_tddl) для хранения сообщений по разделам.
person kimmking    schedule 12.08.2013

Ваш первый шаг — увеличить количество рабочих процессов, обрабатывающих ActiveMQ. Это можно сделать, добавив атрибут ?concurrentConsumers=10 к начальному URI. Поведение по умолчанию заключается в том, что только один поток использует данные из этой конечной точки, что приводит к накоплению сообщений в ActiveMQ. Добавление дополнительных брокеров не поможет.

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

Таким образом, ваш маршрут можно переписать как 2 меньших маршрута:

from("activemq:input?concurrentConsumers=10").id("FirstPhase")
    .process(businessInvokerOne)
    .to("seda:invokeSecondProcess");

from("seda:invokeSecondProcess?concurentConsumers=20").id("SecondPhase")
    .process(businessInvokerTwo)
    .to("activemq:output");

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

Конечную точку seda: можно заменить другой промежуточной конечной точкой activemq:, если вы хотите сохранить сообщение.

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

person Jakub Korab    schedule 13.08.2013
comment
Спасибо за информацию. ИМХО, я думаю, они просто ускоряют транзакцию, но не масштабируют количество транзакций (увеличивая пропускную способность). Что, если я захочу, чтобы он обрабатывал 5000 сообщений в секунду. Я думаю, что мне следует купить другие машины для создания кластера, чтобы они могли выполнять балансировку нагрузки. - person sancho21; 14.08.2013
comment
Скорость обработки и пропускная способность напрямую связаны — 1 поток, обрабатывающий 1000 msg/s, дает такую ​​же пропускную способность, как 1000 потоков, обрабатывающих 1 msg/s. Если вы хотите выйти за рамки того, что даст вам одна машина, вам следует проверить, не является ли ActiveMQ узким местом (это легко проверить с помощью activemq.apache.org/) или маршрут Camel. Если последнее, продолжайте настраивать количество потребителей, пока не найдете верхний предел, а затем добавьте второй экземпляр процесса маршрутизации в другой блок для чтения из того же экземпляра ActiveMQ. - person Jakub Korab; 14.08.2013
comment
Я бы не стал предполагать, что эти этапы обработки всегда можно разбить на архитектуру seda, поскольку фактическая обработка неизвестна. - person Petter Nordlander; 15.08.2013
comment
Вы заметите, что именно поэтому я использовал фразу «может» :) Это не меняет основного ответа, что пропускная способность является функцией времени обработки и количества одновременных потребителей. - person Jakub Korab; 15.08.2013