Дублирование сообщений с профилями и привязками оборудования для нескольких агентов HARD

Задача

В отдельных сегментах сети оператора используются различные схемы доступа и работают независимо друг от друга отдельные DHCP- и RADIUS-серверы. На каждом сервере установлен отдельный экземпляр агента HARD с отдельным кэшем в MongoDB. Необходимо обеспечить получение каждым агентом HARD сообщений из двух общих очередей провижининга.

Решение

Сообщения, получаемые ActiveMQ из очередей провижининга (Oracle AQ), распространяются в режиме мультикаста по нескольким собственным очередям. Каждый агент HARD работает со своей ActiveMQ-очередью и получает свою копию сообщения из провижининга.

...
    <camelContext xmlns="http://camel.apache.org/schema/spring" id="camel">
        ...
        <route>
            <from uri="oracleTopic:topic:AIS_NET.HP_PROFILES_1?clientId=ActiveMQ&amp;durableSubscriptionName=HP"/>
            <multicast stopOnException="true">
                <to uri="activemq:queue:hydra_profiles_pppoe-rad"/>    <!-- Equipment profiles for HARD agent at PPPoE RADIUS-server -->
                <to uri="activemq:queue:hydra_profiles_ran-dhcp"/>     <!-- Equipment profiles for HARD agent at Radio Access Network DHCP-server -->
                <to uri="activemq:queue:hydra_profiles_ran-rad"/>      <!-- Equipment profiles for HARD agent at Radio Access Network RADIUS-server -->
            </multicast>
        </route>
        <route>
            <from uri="oracleTopic:topic:AIS_NET.HP_EQUIPMENT_BINDS_1?clientId=ActiveMQ&amp;durableSubscriptionName=HP"/>
            <multicast stopOnException="true">
                <to uri="activemq:queue:hydra_equipment_binds_pppoe-rad"/>    <!-- Equipment binds for HARD agent at PPPoE RADIUS-server -->
                <to uri="activemq:queue:hydra_equipment_binds_ran-dhcp"/>     <!-- Equipment binds for HARD agent at Radio Access Network DHCP-server -->
                <to uri="activemq:queue:hydra_equipment_binds_ran-rad"/>      <!-- Equipment binds for HARD agent at Radio Access Network RADIUS-server -->
            </multicast>
        </route>
        ...
    </camelContext>
...
...
# Настройки подключения к ActiveMQ
syncer:
  stomp:
    # Адрес
    host: '192.168.123.45'
    # Порт
    port: 61613
    # Имя пользователя
    login: 'hydra'
    # Пароль пользователя
    password: 'Change me please'
  queues:
    # Наименование очереди с профилями
    profiles: 'hydra_profiles_pppoe-rad'
    # Наименование очереди с привязками
    binds: 'hydra_equipment_binds_pppoe-rad'
...
...
# Настройки подключения к ActiveMQ
syncer:
  stomp:
    # Адрес
    host: '192.168.123.45'
    # Порт
    port: 61613
    # Имя пользователя
    login: 'hydra'
    # Пароль пользователя
    password: 'Change me please'
  queues:
    # Наименование очереди с профилями
    profiles: 'hydra_profiles_ran-rad'
    # Наименование очереди с привязками
    binds: 'hydra_equipment_binds_ran-rad'
...

Помещение команд с вызовом определённого скрипта в отдельную очередь

Задача

Один из используемых для провижининга оборудования скриптов работает очень медленно: например он управляет портами коммутаторов доступа по SNMP и часто отправляет команды повторно из-за отсутствия ответа коммутаторов при одной попытке. Так как очередь используется общая, команды с данным скриптом могут «тормозить» при большой нагрузке выполнение «быстрых» команд управления сессиями на BRAS'е. Необходимо отделить обработку проблемных команд от основного потока.

Решение

Сообщения с медленными командами выделяются брокером в отдельную очередь для агента HEX — обрабатываются данные сообщения независимо от остальных.

...
    <camelContext xmlns="http://camel.apache.org/schema/spring" id="camel">
        ...
        <route>
            <from uri="oracleTopic:topic:AIS_NET.HP_COMMANDS_1?clientId=ActiveMQ&amp;durableSubscriptionName=HP"/>
                <choice>
                    <when>
                        <xpath>count(/command/vc_command[contains(.,'/opt/hydra/scripts/reset-switch-port.sh')]) > 0</xpath>
                        <to uri="activemq:queue:hydra_commands_reset-switch-port"/>
                    </when>
                    <otherwise>
                        <to uri="activemq:queue:hydra_commands"/>
                    </otherwise>
                </choice>
        </route>
        <route>
            <from uri="activemq:queue:hydra_command_results"/>
            <to uri="oracleTopic:topic:AIS_NET.HP_COM_RES_1?clientId=ActiveMQ&amp;durableSubscriptionName=HP"/>
        </route>
        ...
    </camelContext>
...
...
hydra:
  command_queues:
    # <Очередь для приёма команд>: <Очередь для отправки результата>
    - 'hydra_commands': 'hydra_command_results'
    - 'hydra_commands_reset-switch-port': 'hydra_command_results'
...

Безусловное автоматическое удаление сообщений из очередей с профилями и привязками оборудования

Задача

Провижининг используется только для формирования команд по конфигурациям. RADIUS-взаимодействия нет — агент HARD не установлен. Сообщения с профилями и привязками оборудования накапливаются в очередях Oracle, напрасно занимая бесценное место в табличных пространствах.

Решение

Настроить в AcitveMQ получение этих сообщений, но без сохранения их в самом брокере. Для этого в конфигурации ActiveMQ можно использовать директиву <stop/>, прерывающую маршрутизацию:

...
    <camelContext xmlns="http://camel.apache.org/schema/spring" id="camel">
        <route>
            <from uri="oracleTopic:topic:AIS_NET.HP_COMMANDS_1?clientId=ActiveMQ&amp;durableSubscriptionName=HP"/>
            <to uri="activemq:queue:hydra_commands_1"/>
        </route>
        <route>
            <from uri="activemq:queue:hydra_command_results_1"/>
            <to uri="oracleTopic:topic:AIS_NET.HP_COM_RES_1?clientId=ActiveMQ&amp;durableSubscriptionName=HP"/>
        </route>
        <route>
            <from uri="oracleTopic:topic:AIS_NET.HP_PROFILES_1?clientId=ActiveMQ&amp;durableSubscriptionName=HP"/>
            <stop/>
            <to uri="activemq:queue:hydra_profiles_1"/>
        </route>
        <route>
            <from uri="oracleTopic:topic:AIS_NET.HP_EQUIPMENT_BINDS_1?clientId=ActiveMQ&amp;durableSubscriptionName=HP"/>
            <stop/>
            <to uri="activemq:queue:hydra_equipment_binds_1"/>
        </route>
    </camelContext>
...

Директиву to из маршрута удалять не стоит: при необходимости «включения» достаточно будет закомментировать или удалить строку с stop.