Кластеризация JMS с помощью Spring

Как разработчику мне необходимо кластеризовать JMS, чтобы только один узел обрабатывал задачу (задача означает сообщение очереди), а задачи могли обрабатываться другим узлом, когда один из них выходит из строя.

Предположения:

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

Стек прикладных технологий на данный момент:

Веб-приложение на основе Spring 3.2.X и со встроенным брокером ActiveMQ, которое запускается во время инициализации приложения (‹amq: broker />) без сохранения. Только это приложение использует созданного брокера. Приложение, работающее на JBoss 5.0.1.

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

В настоящее время я колеблюсь между следующими возможностями:

  • встроенный ActiveMQ на двух узлах JBoss (http://activemq.apache.org/integrating-apache-activemq-with-jboss.html) подключен как кластер
  • развертывать ActiveMQ в JBoss только без интеграции (я заметил, что ActiveMQ 5.9 запускается без интеграции, упомянутой в приведенной выше ссылке на activemq-jms-ds.xml, и я могу подключиться к JMS напрямую, без фабрики соединений и JNDI, определенных в Spring). Я прав ?
  • два встроенных брокера, начиная с приложения Spring на обоих узлах и подключенных как кластер (?) Возможно ли?
  • отдельно запущены два сервера ActiveMQ, подключенных как кластер (более новая версия ActiveMQ не требует контейнера и может работать отдельно)

Что из вышеперечисленного может быть лучшим? Должен ли я сделать это по-другому?

Кластеризация JMS для меня относительно нова, поэтому все комментарии и замечания приветствуются.


person Przemek Nowak    schedule 28.02.2014    source источник
comment
Вопрос на самом деле не относится к Spring, поскольку он с радостью подключится к любой инфраструктуре брокера JMS, которую вы создадите. Кластеризация JMS обеспечивается коммерческим полнофункциональным сервером приложений. В мире открытого кода я бы посмотрел на HornetQ.   -  person Stephane Nicoll    schedule 09.04.2014
comment
Привет, Стефан, взгляните на выбранное решение ...   -  person Przemek Nowak    schedule 02.05.2014


Ответы (1)


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

Я также попытался запустить встроенный ActiveMQ в Spring, настроенный как отказоустойчивый кластер, но у меня была одна общая проблема: с конфигурацией аварийного переключения один брокер ActiveMQ ожидает блокировки файла / базы данных, и эта ситуация приостанавливает инициализацию контекста Spring - вот почему я не мог использовать этот подход (приложение на втором узле должно работать).

person Przemek Nowak    schedule 02.05.2014