Как разработчику мне необходимо кластеризовать 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 для меня относительно нова, поэтому все комментарии и замечания приветствуются.