ActiveMQ рассылка сообщений - PullRequest
2 голосов
/ 16 марта 2009

У меня есть несколько серверов, которые создают XML-файлы из Python, и некоторые другие серверы, которые используют эти XML-файлы с использованием Java. Я только недавно изучил JMS и ActiveMQ и решил попробовать использовать его для передачи файлов XML.

Итак, я установил демоны ActiveMQ на серверах потребителей и решил, что на продуктах будет реализован некоторый метод циклического распределения для равномерного распределения xmls по потребителям.

Python  -----------------------------> ActiveMQ ---> Java
        \                           /
         \                         /
          ---------------------------> ActiveMQ ---> Java
                                 /  /
Python  ----------------------------

Для тестирования я запустил одного производителя и одного потребителя и посмотрел результаты.

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

Python  -----------------------------> ActiveMQ ---> Java (work)
                                          |
                                          |
                                       ActiveMQ (xmls piling up)

РЕДАКТИРОВАТЬ: Это не то, что на самом деле произошло, извините. Подробности см. Ниже

Теперь я не жалуюсь, так как это то, что я хотел в любом случае, но я немного запутался: как правильно реализовать эту очередь "многие ко многим", к которой я стремлюсь?

Должен ли я также установить демоны ActiveMQ на своих машинах-производителях, отправить xmls на локальный ActiveMQs и доверять автоматическому обнаружению, чтобы получить xmls для потребителей?

Python ---> ActiveMQ ------------------------------ ActiveMQ ---> Java
                |                                      |
                |                                      |
                |                                -- ActiveMQ ---> Java
                |                               |  
Python ---> ActiveMQ----------------------------

Стоит ли придерживаться моего первоначального плана и циклически пересылать сообщения на потребительские машины, просто чтобы быть в безопасности?

Или есть API, который я должен использовать, чтобы скрыть эти детали от моих процессов?

Кстати, производители - это процессы Python, использующие STOMP, а потребители - Java, использующие JMS.

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

EDIT

Очевидно, когда я работал «один производитель и один потребитель», я не заметил, что другие потребители уже работали. Они просто не делали ничего полезного с обработанными ими xmls. Вот почему я видел частичные результаты.

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

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

Обратите внимание, что в документации утверждается, что автоматическое обнаружение не рекомендуется для производственных установок.

Принятый ответ ниже все еще остается верным. Самый простой способ использовать ActiveMQ - это просто использовать один или два сервера в качестве «серверов очереди». Тем не менее, я решил пойти по своему первоначальному плану, потому что я думаю это уменьшит сетевой трафик (с промежуточным сервером xmls должен входить в него и выходить из него снова).

1 Ответ

1 голос
/ 23 марта 2009

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

Наличие экземпляра MOM (будь то ActiveMQ, RabbitMQ или любого другого брокера MOM) в случае с одним пользователем не имеет смысла концептуально. Скорее, лучше думать о вашем брокере MOM как о маршрутизаторе сообщений.

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...