Сконфигурируйте потребителя очереди сети брокеров, чтобы он никогда не был локальным, если только не произошел сбой брокера - PullRequest
1 голос
/ 13 марта 2012

У меня есть пара брокеров, настроенных как сеть брокеров с ActiveMQ 5.5.1. Каждый брокер существует на сервере, который обменивается данными через глобальную сеть.

Брокер A на сервере A

<amq:broker useJmx="false" persistent="false">
    <amq:networkConnectors>
        <amq:networkConnector uri="static:(tcp://BrokerB:61616)" duplex="true" />
    </amq:networkConnectors>
    <amq:transportConnectors>
      <amq:transportConnector uri="tcp://BrokerA:61616" />
    </amq:transportConnectors>
</amq:broker>

BrokerB на сервере B

<amq:broker useJmx="false" persistent="false">
    <amq:networkConnectors>
        <amq:networkConnector uri="static:(tcp://BrokerA:61616)" duplex="true" />
    </amq:networkConnectors>
    <amq:transportConnectors>
        <amq:transportConnector uri="tcp://BrokerB:61616" />
    </amq:transportConnectors>
</amq:broker>

На каждом сервере у меня запущена служба Java, которая создает следующую тему и очередь:

<amq:queue id="myQueue" physicalName="myQueue" />
<amq:topic id="myTopic" physicalName="MyTopic" />

Служба java (на каждом сервере) создает производителя и потребителя для myQueue , а также производителя и потребителя для myTopic . Я хочу, чтобы оба потребителя на myTopic получали все тематические сообщения, что он и делает. Проблема заключается в myQueue . Я только хочу, чтобы сконфигурированный брокер использовал myQueue сообщений. Например, если BrokerA создает служебное сообщение на ServerA, я хочу, чтобы BrokerB только на ServerB использовал это сообщение. Прямо сейчас в моем тесте я вижу около 50% сообщений, созданных на ServerA, потребляемых BrokerA, и 50%, используемых BrokerB. Кроме того, если BrokerB переходит в автономный режим, BrokerA должен принимать все сообщения myQueue от ServerA и ServerB и потреблять все сообщения myQueue до тех пор, пока BrokerB не вернется в оперативный режим.

Я думал об использовании групп сообщений, но не смог найти хороший способ определить, когда произошел сбой, для переключения, в какую группу отправляется сообщение. Любые рекомендации будут с благодарностью!

1 Ответ

1 голос
/ 15 марта 2012

вы можете указать «исключенные назначения», чтобы предотвратить отправку сообщений очереди другим брокерам ...

<networkConnectors>
    <networkConnector uri="static:(tcp://BrokerB:61616)" duplex="true" >
        <excludedDestinations>
            <queue physicalName="myQueue"/>
        </excludedDestinations>
    </networkConnector>
</networkConnectors>

на ваш другой вопрос о том, чтобы убедиться, что потребитель "никогда не подключится к локальному брокеру, если не произойдет сбой брокера"... если вы выполните следующее при подключении к клиенту, вы всегда будете подключаться к удаленному посреднику, если он недоступен ... также вы восстановитесь на удаленном посреднике, когда он станет доступен

failover:(tcp://remoteBroker,tcp://localBroker)?randomize=false&priorityBackup=true
...