Иерархия инстансов
Общие положения
Иерархия инстансов представляет собой одноуровневую иерархическую структуру, на верхнем уровне которого расположен главный (master) инстанс, на нижнем располагаются дочерние (child) инстансы.
Основные правила работы иерархии инстансов:
- На master от child передаются следующие данные:
- метаданные (объект, рубрика, контроллер, типовая конфигурация, устройства, измеряемые и вычисляемые параметры, поправки к измеряемым параметрам на контроллере, а также вспомогательные справочники, которые создаются при их отсутствии на master);
- измерения (значения измеряемых и вычисляемых параметров на контроллере);
- события (доступность контроллеров, устройств, результаты выполнения команд отправленных с master);
- От master на child передаются только команды управления ручным режимом и установки значений измеряемому параметру;
- На master настраиваются свои функции контроля параметров;
- На master, на полученные объекты распространяются права пользователей, установленные для компании в которую передается объект с child.
Иерархия инстансов построена на передачи jms сообщений между инстансами master и child c использованием брокера Artemis и его расширения Federation.
Artemis и его расширение Federation обеспечивают всю маршрутизацию сообщений и их доставку между удаленными узлами.
Настройка очередей
На каждом инстансе, которые участвуют в иерархии добавить следующие очереди:
<address name="jms.queue.HierarchyExport">
<anycast>
<queue name="jms.queue.HierarchyExport"/>
</anycast>
</address>
<address name="jms.queue.HierarchyMeasure">
<multicast>
<queue name="jms.queue.HierarchyMeasure"/>
</multicast>
</address>
<address name="jms.queue.HierarchyMetaData">
<multicast>
<queue name="jms.queue.HierarchyMetaData"/>
</multicast>
</address>
<address name="jms.queue.HierarchyEvent">
<multicast>
<queue name="jms.queue.HierarchyEvent"/>
</multicast>
</address>
<address name="jms.queue.HierarchyCommand">
<multicast>
<queue name="jms.queue.HierarchyCommand"/>
</multicast>
</address>Типы, назначение адресов и очередей:
HierarchyExport - anycast, используется для передачи сообщения о необходимости отправить метаданные по объекту на master;
HierarchyMeasure, HierarchyMetaData, HierarchyEvent - multicast, на child для отправки данных на master;
HierarchyCommand - multicast, для отправки команд ;
Очереди добавляются для модулей:
engine;
periodic;
rest-services.
Настройка модуля engine
Engine выполняет основные функции иерархии.
Функции выполняемые на child:
- подготовка и отправка сообщений в очередь метаданных;
- подготовка и отправка сообщений в очередь измерений;
- подготовка и отправка сообщений в очередь событий;
- прием и разбор сообщений о командах с главного инстанса;
- отправка результатов выполнения команд с главного инстанса.
Функции выполняемые на master:
- прием и обработка сообщений из очереди метаданных;
- прием и обработка сообщений из очереди измерений;
- прием и обработка сообщений из очереди событий;
- прием и разбор сообщений о командах с главного инстанса;
- прием и обработка сообщений о результатах выполнения команд на дочернем инстансе.
В конфигурационный файл engine необходимо добавить следующие очереди (на master и child):
hierarchyexport:
destination: jms.queue.HierarchyExport
concurrency: 1-8
hierarchymetadata:
destination: jms.topic.HierarchyMetaData
hierarchymeasure:
destination: jms.topic.HierarchyMeasure
hierarchyevent:
destination: jms.topic.HierarchyEvent
hierarchycommand:
destination: jms.topic.HierarchyCommandИнфо
Так как HierarchyMetaData, HierarchyMeasure, HierarchyEvent, HierarchyCommand имеют тип multicast, то в конфиге они описываются, как jms.topic., хотя в конфигурации Artemis они имеют префикс jms.queue
Настройка модуля periodic
Компонент выполняет свои функции только на child. Один раз в час (каждая 7 минута часа) выбираются все объекты которые настроены на передачу данных по иерархии, и для всех таких объектов отправляется сообщение в очередь для sem-engine для отправки метаданных. Тем самым обеспечивается синхронизация изменений в метаданных с дочернего инстанса на главный.
В конфигурационный файл periodic необходимо добавить следующие очереди (на master и child) :
hierarchyexport:
destination: jms.queue.HierarchyExport
concurrency: 1-8
hierarchymetadata:
destination: jms.topic.HierarchyMetaData
hierarchymeasure:
destination: jms.topic.HierarchyMeasure
hierarchyevent:
destination: jms.topic.HierarchyEvent
hierarchycommand:
destination: jms.topic.HierarchyCommandНастройка модуля rest-services
Компонент обеспечивает выполнение команд ручного управления и установки значения на мастере с отправкой этих данных на соответствующий child.
В конфигурационный файл periodic необходимо добавить следующие очереди (на master и child) :
hierarchyexport:
destination: jms.queue.HierarchyExport
concurrency: 1-8
hierarchycommand:
destination: jms.topic.HierarchyCommandНастройка Federation
Узел Child
На каждом узле child прописываем коннектор master-узла.
<!-- Connectors -->
<connectors>
<connector name="netty-connector">tcp://child1:61616</connector>
<connector name="master-connector">tcp://master:61616</connector>
</connectors>где child1 - dns имя child узла,
master - dns имя master узла.
Узел Master
Прописываем коннекторы на все узлы child.
<!-- Connectors -->
<connectors>
<connector name="netty-connector">tcp://localhost:61616</connector>
<connector name="child1-connector">tcp://child1:61616?ackBatchSize=100&consumerWindowSize=-1</connector>
<connector name="master-connector">tcp://master:61616</connector>
</connectors>где child1 - dns имя child узла,
master - dns имя master узла.
Инфо
Если в иерархии инстансов используется несколько дочерних инстансов, тогда все они должны быть заданы в списке подключений
Примечание
Для всех дочерних коннекторов важно задавать ?ackBatchSize=100&consumerWindowSize=-1 - определяет возможность передачи больших сообщений
В конфигурацию очередей брокера Artemis должны быть добавлены настройки конфигурации федерации адресов:
<!-- Federation -->
<federations>
<federation name="hierarchy-federation" user="artemis" password="SuperHot">
<upstream name="master-upstream">
<circuit-breaker-timeout>1000</circuit-breaker-timeout>
<share-connection>true</share-connection>
<static-connectors>
<connector-ref>child1-connector</connector-ref>
</static-connectors>
<policy ref="policyChild"/>
</upstream>
<downstream name="master-downstream">
<circuit-breaker-timeout>1000</circuit-breaker-timeout>
<share-connection>true</share-connection>
<static-connectors>
<connector-ref>child1-connector</connector-ref>
</static-connectors>
<policy ref="policyMaster"/>
<upstream-connector-ref>master-connector</upstream-connector-ref>
</downstream>
<address-policy name="policyChild" auto-delete="false" auto-delete-message-count="-1">
<include address-match="HierarchyMetaData" />
<include address-match="HierarchyMeasure" />
<include address-match="HierarchyEvent" />
</address-policy>
<address-policy name="policyMaster" auto-delete="false" auto-delete-message-count="-1">
<include address-match="HierarchyCommand" />
</address-policy>
</federation>
</federations>Если в иерархии инстансов используется несколько дочерних инстансов связанных с master, тогда все они должны быть заданы в списке подключений <static-connectors> для <upstream name="master-upstream">.
Если на дочерних инстансах используются уникальные dns-имена master узла, то для каждого child-узла в конфигурацию вносится отдельная секция <downstream name="master-downstream">.
Если на всех дочерних имя коннектора одно, тогда достаточно в <static-connectors> для <downstream name="master-downstream"> перечислить все дочерние подключения
Примечание
В настройках правил федерации адресов auto-delete="false" auto-delete-message-count="-1" устанавливает, что если сервер, которому предназначены сообщения не доступен (например, master), то сообщения, отправляемые по федерации, будут храниться на источнике (в примере это child) пока не восстановится подключение (к master), и сообщения не передадутся на сервер назначения. При длительных потерях связи и большом потоке данных между инстансами данная настройка может требовать значительный объем дискового пространства для Artemis.
При необходимости, данными параметрами и параметром auto-delete-delay, можно настроить хранение определенного объема сообщений.
Настройка на инстансе Master
Зайдите под системной учетной записью в раздел Мастер инстансов. Зарегистрируйте child инстанс.
Инфо
Для регистрации child инстанса требуется его GUID. Возьмите его на child-инстансе в разделе Компании. Каждая компания имеет свой уникальный GUID.
Настройка на инстансе Child
На форме объектов отметьте чекбокс Участник иерархии. Это будет признаком необходимости включить данный объект в схему иерархии и передать данные, описанные выше, на master.