Может ли кто-нибудь уточнить поведение виртуальных тем 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).
Таким образом, каждый потребитель потреблял ровно одно сообщение. Если я повторяю его с большим количеством сообщений, он все равно работает одинаково. Никаких дубликатов не поступало, а также нет потерянных сообщений. Количество входящих сообщений в каждой физической очереди совпадает с номером виртуальной темы.
Это как раз поведение, которое я ожидал бы от виртуальной темы в случае сети брокеров.
Но теперь источник моего замешательства:
это, скорее всего, вы получите повторяющиеся сообщения, если используется конфигурация сети по умолчанию . Это связано с тем, что сетевой узел не только отправит сообщение в виртуальную, но и связанные с ним физические очереди.
Прежде всего, я не видел дубликатов, и это сработало хорошо. Но что произойдет, если я последую за советом и отключу назначение физической очереди?
<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 немного устарела. Может ли кто-нибудь подтвердить или опровергнуть это?
Заранее благодарен!
Спасибо большое, теперь совершенно ясно для меня. Единичный тест отлично смотрится и помогает много. –
@ceposta - Я экспериментирую, переключая нашу текущую общую мастер-память хранилища с сетевой настройкой брокера. Мы активно используем виртуальные темы - ваш вышеупомянутый ответ означает, что нет возможности создать виртуальные темы для сетевых посредников? Разрешить потребителям темы и/или виртуальным пользователям очереди на темы для любого из брокеров? Кажется, какая бы я ни выбрала (исключая темы или исключая v.queues), я получаю какое-то нежелательное поведение. – jamespconnor