2013-06-03 2 views
1

Может ли кто-нибудь уточнить поведение виртуальных тем activemq в контексте Сети брокеров? У меня есть путаница в распространении подписки.Как Activemq распространяется распространение подписки на виртуальные темы в сети брокеров?

Например, есть один брокер, у которого есть сетевой разъем для другого. Допустим, брокер mq001 имеет следующий сетевой разъем, открытый для брокера mq002:

<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

я могу заметить некоторые интересные поведение в консоли activemq. Прежде всего, нет темы "VirtualTopic.tempTopic". Тем не менее, существует очередь (основная физическая очередь виртуальной темы) - Consumer.A.VirtualTopic.tempTopic И в этой очереди есть один активный локальный потребитель.

Затем я запускаю другого потребителя (B) в ту же виртуальную тему, но уже на брокере 2 (mq002).

endpointURI - ActiveMQ: Consumer.B.VirtualTopic.tempTopic

Если я взгляну на ActiveMQ консоли на брокера 2 сейчас. Я до сих пор не вижу виртуальной темы. Существует еще одна физическая очередь, созданная 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> 

Тогда, когда я начать потребитель, я не вижу удаленный потребитель больше слушать физической Consumer.B очереди на брокер mq001. И если я публикую сообщения на виртуальную тему, то она потребляется только Consumer.A (локальная). Таким образом, похоже, что распространение подписки игнорируется для виртуальных тем и работает только в физических очередях.

Он выглядит так, как документация activemq немного устарела. Может ли кто-нибудь подтвердить или опровергнуть это?

Заранее благодарен!

ответ

2

Таким образом, ваши тесты правильные. Я только что обновил документы, чтобы указать, что вы можете получить дубликаты при использовании как традиционных подписчиков тем, так и абонентов виртуальной темы для одного и того же адресата по сети. Это означает, что в вашем примере, если бы у меня был абонент темы «VirtualTopic.tempTopic» на mq002, а также потребитель для очереди «Consumer.B.VirtualTopic.tempTopic», тогда я могу закончить с помощью дуплексов. Надеюсь, это проясняет ситуацию. Если вы используете ТОЛЬКО подписчиков на основе очереди, не исключайте перенаправление запросов на основе очереди.

Я написал модульный тест, который вы можете посмотреть на здесь:

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

Смежные вопросы