Вопрос

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

ИЗМЕНИТЬ

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

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

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

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

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

Это было полезно?

Решение

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top