У меня есть несколько серверов, которые создают 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 должен входить в него и выходить из него снова).