문제

Python에서 xml 파일을 생성하는 여러 서버와 Java를 사용하여 해당 xml을 사용하는 다른 서버가 있습니다.나는 최근에야 JMS를 조사했고 액티브MQ 그리고 그것을 사용하여 xml 파일을 전달하기로 결정했습니다.

그래서 소비자 서버에 ActiveMQ 데몬을 설정하고 XML을 소비자 전체에 균등하게 배포하기 위해 생산물에 순환 방법을 구현할 것이라고 생각했습니다.

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

테스트를 위해 하나의 생산자(Producer)와 하나의 소비자(Consumer)를 실행하고 결과를 살펴보았습니다.

놀랍게도 생산자의 메시지는 네트워크의 모든 ActiveMQ 서버에 배포되었습니다.하나의 소비자만 실행했기 때문에 해당 시스템의 ActiveMQ 데몬에 도달한 xml만 수신했고 나머지 xml은 다른 시스템의 다른 ActiveMQ 데몬에서 인내심을 갖고 기다리고 있었습니다.

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

편집하다:이것은 실제로 일어난 일이 아닙니다. 죄송합니다.자세한 내용은 아래를 참조하세요.

어쨌든 이것이 내가 원했던 것이기 때문에 불평하는 것은 아니지만 약간 혼란스럽습니다.내가 추구하는 다대다 대기열을 구현하는 적절한 방법은 무엇입니까?

생산자 컴퓨터에도 ActiveMQ 데몬을 설정하고 xml을 로컬 호스트 ActiveMQ로 보내고 자동 검색을 신뢰하여 xml을 소비자에게 전달해야 합니까?

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

안전을 위해 원래 계획을 고수하고 소비자 컴퓨터 전체에 메시지를 순환해야 합니까?

아니면 내 프로세스에서 해당 세부정보를 숨기는 데 사용해야 하는 API가 있나요?

그런데 생산자는 STOMP를 사용하는 Python 프로세스이고 소비자는 JMS를 사용하는 Java입니다.

내 형편없는 ASCII 아트로 인해 눈이 아프셨다면 사과드립니다. 말로만 설명할 수 있을지 확신할 수 없습니다.

편집하다

분명히, "한 생산자와 하나의 소비자"를 실행했을 때 다른 소비자가 이미 실행 중이라는 사실을 눈치채지 못했습니다.그들은 처리한 XML에 대해 유용한 작업을 수행하지 않았습니다.그래서 부분적인 결과를 보았습니다.

좀 더 읽고 약간의 실험을 한 후 다음과 같은 사실을 알아냈습니다.

기본적으로 ActiveMQ는 로컬 네트워크에서 다른 ActiveMQ 인스턴스를 자동으로 검색하고 저장 후 전달을 생성합니다. 브로커 네트워크.이는 생산자가 XML을 모든 ActiveMQ 인스턴스에 게시할 수 있고 동일한 네트워크의 다른 ActiveMQ 인스턴스를 수신하는 소비자에게 가는 길을 찾을 수 있음을 의미합니다.

문서에서는 프로덕션 설정에는 자동 검색이 권장되지 않는다고 주장합니다.

그러나 아래에서 허용되는 답변은 여전히 ​​​​사실입니다.ActiveMQ를 사용하는 가장 간단한 방법은 하나 또는 두 개의 서버를 "큐 서버"로 사용하는 것입니다.그럼에도 불구하고 저는 원래 계획대로 진행하기로 결정했습니다. 생각하다 그러면 네트워크 트래픽이 줄어듭니다(중간 서버를 사용하면 XML이 다시 들어왔다가 나가야 합니다).

도움이 되었습니까?

해결책

Itsadok, 아마도 메시징의 올바른 사용을 고려하고 있지 않은 것 같습니다.

소비자당 1인 케이스에 MOM 인스턴스(ActiveMQ, RabbitMQ 또는 기타 MOM 브로커)를 갖는 것은 실제로 개념적으로 의미가 없습니다.오히려 MOM 브로커를 메시지 라우터로 생각하는 것이 가장 좋습니다.

이 경우 모든 생산자와 모든 소비자가 연결되는 하나의 ActiveMQ 브로커 인스턴스(확장 문제가 있는 경우 샤딩되거나 다른 방식으로 확장될 수 있고, HA 고려 사항이 있는 경우 복제될 수 있음)를 갖게 됩니다.그런 다음 모든 XML은 동일한 브로커 인스턴스로 이동하고 모든 소비자는 동일한 브로커 인스턴스에서 읽습니다.이 경우 브로커는 사용하는 경험적 방법을 기반으로 메시지가 어느 소비자에게 전달되어야 하는지 결정합니다.

이는 또한 생산자와 소비자를 동적으로 추가하고 제거할 수 있으며 아무 것도 변경되지 않는다는 것을 의미합니다.모두 동일한 브로커에 연결되므로 로드가 변경되거나 시스템이 실패할 때 생산자와 소비자를 추가하고 제거할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top