2013-06-03 3 views
1

누군가가 Network of Brokers의 컨텍스트에서 activemq 가상 주제의 동작을 명확히 할 수 있습니까? 가입 전파에 혼란이 있습니다.브로커의 네트워크에서 Activemq 가상 주제 구독 전파가 어떻게 작동합니까?

예를 들어 다른 브로커와 네트워크 커넥터가있는 브로커가 있습니다. 그런 다음

<networkConnectors> 
      <networkConnector name="connectorToRemoteBroker" uri="static:(tcp://mq002:61616)?maxReconnectAttempts=0" duplex="false"    networkTTL="3" decreaseNetworkConsumerPriority="true"> 
</networkConnectors> 

내가 실행 소비자 (A) 브로커 mq001에 가상 주제 : endpointURI : activemq:Consumer.A.VirtualTopic.tempTopic

내가 몇 가지 흥미로운를 알 수 있습니다 브로커 mq001은 브로커 mq002에 개방형 네트워크 커넥터를 다음했다 말할 수 있습니다 동작을 확인하십시오. 우선, 주제가 없습니다 "VirtualTopic.tempTopic"가 생성되었습니다. 그러나 대기열 (가상 주제의 기본 물리적 대기열)이 있습니다. Consumer.A.VirtualTopic.tempTopic 그리고이 대기열에는 활성 로컬 소비자가 하나 있습니다.

그런 다음 다른 소비자 (B)를 동일한 가상 주제로 시작하지만 이미 브로커 2 (mq002)에 있습니다.

endpointURI - ActiveMQ를 : Consumer.B.VirtualTopic.tempTopic

지금은 브로커 2 ActiveMQ를 콘솔을 살펴합니다. 아직 사용 가능한 가상 주제가 표시되지 않습니다. Consumer.B.VirtualTopic.tempTopic에는 활성 소비자 (mq002의 경우 로컬)가 하나씩있는 다른 물리적 대기열이 있습니다.

나는 브로커 콘솔을 살펴 때 하나 지금은 두 개의 큐를 참조하십시오

Consumer.A.VirtualTopic.tempTopic - 활성와 - 활성 지역 소비자 Consumer.B.VirtualTopic.tempTopic과를 원격 소비자.

따라서 구독 전파는 최소한 물리적 대기열 수준에서 작동합니다. 듀플렉스가 아니기 때문에 mq002에서 mq001까지만 작동합니다.

는 그럼 난 주제에 메시지를 게시 :

activemq:topic:VirtualTopic.tempTopic 

그것은 mq001 및 mq002 모두에서 소비자에 의해 소비되고있다. 또한 마침내 activemq 콘솔 (VirtualTopic.tempTopic)에서 사용할 수있는 주제가 있습니다.

그래서 각 소비자는 정확히 하나의 메시지를 소비했습니다. 더 많은 수의 메시지로 반복하면 여전히 동일하게 작동합니다. 중복 된 메시지가 없으며 손실 된 메시지도 없습니다. 각 물리적 큐의 대기열에 포함 된 메시지 수는 가상 주제의 수와 일치합니다.

이것은 정확히 브로커 네트워크의 경우 가상 주제에서 기대하는 동작입니다.

하지만 지금 내 혼란의 원인 :

http://activemq.apache.org/virtual-destinations.html#VirtualDestinations-AvoidingDuplicateMessageinaNetworkofBrokers

는 기본 네트워크 구성을 사용하는 경우 중복 메시지를 얻을 가능성이 높습니다. 이는 네트워크 노드가 가상 토픽으로 전송 된 메시지 전달뿐만 아니라 연관된 물리적 큐이기도하기 때문입니다.

우선 무엇이든 중복 된 것을 보지 못했지만 잘 작동했습니다. 그러나 조언을 따르고 실제 대기열 대상을 비활성화하면 어떻게됩니까? 나는 소비자를 시작 할 때

<networkConnectors> 
      <networkConnector name="connectorToRemoteBroker" uri="static:(tcp://mq002:61616)?maxReconnectAttempts=0" duplex="false" networkTTL="3" decreaseNetworkConsumerPriority="true"> 
       <excludedDestinations> 
         <queue physicalName="Consumer.*.VirtualTopic.>"/> 
       </excludedDestinations> 
      </networkConnector> 
     </networkConnectors> 

그런 다음 나는 원격 소비자가 더 이상 브로커 mq001의 물리적 큐 Consumer.B을 듣고 볼 수 없습니다. 가상 토픽에 메시지를 게시하면 Consumer.A (로컬)에서만 소비됩니다. 따라서 구독 전달은 가상 주제에 대해서는 무시되고 실제 대기열에서만 작동합니다.

나는 activemq 문서가 조금 오래되었다고 생각합니다. 아무도 그것을 확인하거나 반박 할 수 있습니까?

미리 감사드립니다.

답변

2

위 테스트가 정확합니다. 네트워크에서 동일한 대상에 대한 기존의 주제 가입자와 가상 주제 가입자를 모두 사용할 때 dups를 얻을 수 있도록 지정하기 위해 문서를 업데이트했습니다. 즉, 예를 들어, mq002의 "VirtualTopic.tempTopic"이라는 주제 구독자와 "Consumer.B.VirtualTopic.tempTopic"대기열의 소비자가있는 경우 dups로 끝날 수 있습니다. 일이 끝나기를 바란다. 대기열 기반 구독자 만 사용하는 경우 대기열 기반 요청 전달을 제외하지 마십시오.

난 당신이 여기에서 좀 걸릴 수 있습니다 단위 테스트 작성했습니다 :

http://svn.apache.org/viewvc/activemq/trunk/activemq-unit-tests/src/test/java/org/apache/activemq/usecases/TwoBrokerVirtualTopicForwardingTest.java?view=markup

+0

덕분에 많이, 지금은 나에게 완전히 분명하다. 단위 테스트는 좋아 보이며 도움이됩니다. –

+0

@ceposta - 네트워크 브로커 설정으로 현재 공유 스토리지 마스터 - 슬레이브 설정을 전환하고 있습니다. 우리는 가상 토픽을 많이 사용합니다 - 위의 대답은 가상 토픽을 네트워크로 연결된 브로커간에 의도 한대로 작동시킬 수있는 방법이 없다는 것을 의미합니까? 중개인 중 하나에서 주제 소비자 및/또는 가상 주제 대기열 소비자를 허용합니까? 그것은 내가 선택한 설정 (주제를 제외하거나 v.queues 제외)처럼 보이지만, 나는 바람직하지 않은 행동을합니다. – jamespconnor

관련 문제