Перейти к основному содержимому

Параллельные стратегии с использованием MDB

· 4 мин. чтения

1. Введение

Компоненты, управляемые сообщениями, также известные как «MDB», обрабатывают сообщения в асинхронном контексте. Мы можем изучить основы MDB в этой статье .

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

Если вы хотите больше узнать об основах параллелизма с использованием Java, вы можете начать здесь .

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

2. Настройка пула потоков

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

Поток MessageListener отвечает за выполнение метода onMessage MDB. Этот поток является частью пула потоков MessageListener , что означает, что он объединен в пул и повторно используется снова и снова. Этот пул также имеет конфигурацию, которая позволяет нам установить количество потоков, что может повлиять на производительность:

  • установка небольшого размера пула приведет к тому, что сообщения будут потребляться медленно («MDB Throttling»)
  • установка очень большого размера пула может снизить производительность или вообще не работать.

В Wildfly мы можем установить это значение, обратившись к консоли управления. Возможность JMS не включена в автономном профиле по умолчанию; нам нужно запустить сервер, используя полный профиль .

Обычно при локальной установке доступ к ней осуществляется через http://127.0.0.1:9990/console/index.html. После этого нам нужно зайти в Configuration/Subsystems/Messaging/Server, выбрать наш сервер и нажать «View».

Выберите вкладку «Атрибуты», нажмите «Изменить» и измените значение «Максимальный размер пула потоков». Значение по умолчанию — 30.

3. Настройка максимальных сессий

Еще одно настраиваемое свойство, о котором следует знать, — это Maximum Sessions . Это определяет параллелизм для конкретного порта прослушивателя. Обычно это значение по умолчанию равно 1, но его увеличение может повысить масштабируемость и доступность приложения MDB.

Мы можем настроить его либо с помощью аннотаций, либо с помощью дескрипторов .xml . Через аннотации мы используем @ActivationConfigProperty :

@MessageDriven(activationConfig = {
@ActivationConfigProperty(
propertyName=”maxSession”, propertyValue=50
)
})

Если выбран метод конфигурации с дескрипторами .xml , мы можем настроить maxSession следующим образом:

<activation-config>
<activation-config-property>
<activation-config-property-name>maxSession</activation-config-property-name>
<activation-config-property-value>50</activation-config-property-value>
</activation-config-property>
</activation-config>

4. Среда развертывания

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

Для этого конкретного случая у нас есть важный выбор:

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

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

5. Модель сообщений и типы сообщений

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

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

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

Чтобы потреблять из темы по модели публикации-подписки, мы можем использовать аннотации:

@ActivationConfigProperty(
propertyName = "destinationType",
propertyValue = "javax.jms.Topic")

Опять же, мы также можем настроить эти значения в дескрипторе развертывания .xml :

<activation-config>
<activation-config-property>
<activation-config-property-name>destinationType</activation-config-property-name>
<activation-config-property-value>javax.jms.Topic</activation-config-property-value>
</activation-config-property>
</activation-config>

Если отправка одного и того же сообщения многим потребителям не является обязательным требованием, будет достаточно обычной модели PTP (точка-точка).

Чтобы потреблять из очереди, мы устанавливаем аннотацию как:

@ActivationConfigProperty(
propertyName = "destinationType",
propertyValue = "javax.jms.Queue")

Если мы используем дескриптор развертывания .xml , мы можем установить его:

<activation-config>
<activation-config-property>
<activation-config-property-name>destinationType</activation-config-property-name>
<activation-config-property-value>javax.jms.Queue</activation-config-property-value>
</activation-config-property>
</activation-config>

6. Заключение

Как уже заявляли многие компьютерщики и ИТ-писатели, скорость процессоров больше не растет быстрыми темпами. Чтобы наши программы работали быстрее, нам нужно работать с большим количеством процессоров и ядер, доступных сегодня.

В этой статье обсуждались некоторые рекомендации по максимально эффективному использованию параллелизма с помощью MDB.