Описание подписок на основе селекторов — различия между версиями
Wikiadmin (обсуждение | вклад) (Новая страница: « ===Предпосылка=== Усложнение критериев выборки интересующих подписчика событий, наприм…») |
Makarov (обсуждение | вклад) |
||
| (не показана 1 промежуточная версия 1 участника) | |||
| Строка 7: | Строка 7: | ||
Подписки на селекторах должны обеспечить высокую степень управляемости очередей | Подписки на селекторах должны обеспечить высокую степень управляемости очередей | ||
| − | сообщений обусловленную использованием специальных объектов для конфигурирования | + | сообщений, обусловленную использованием специальных объектов для конфигурирования |
очереди, а не компонентов составного имени темы. | очереди, а не компонентов составного имени темы. | ||
===Термины=== | ===Термины=== | ||
| − | Селектор - объект проверяющий сообщение и | + | Селектор - объект проверяющий сообщение и/или, его контекст на соответствие некоторому условию, которое, и является сутью селектора. Простые селекторы могут проверять, например, равенство некоторого поля сообщения заданному значению, другие - составные, содержать другие селекторы, и производить над ними операции AND, OR, NOT. То есть - компоновать другие селекторы в дерево булевого выражения. |
| − | некоторому условию, которое и является сутью селектора. Простые селекторы могут проверять | ||
| − | например равенство некоторого поля сообщения заданному значению, другие - составные, | ||
| − | содержать другие селекторы и производить над ними операции AND, OR, NOT. То есть | ||
| − | компоновать другие селекторы в дерево булевого выражения. | ||
| − | Сообщение - объект описывающий изменение параметра базы данных | + | Сообщение - объект описывающий изменение параметра базы данных |
| − | Контекст - объект или свойство объекта не | + | Контекст - объект или свойство объекта не входящее в объект-сообщение, но связанный с ним. |
Текущие дата и время, пользователь отправивший изменения, объект сервера, связи объекта - всё это примеры контекстов. | Текущие дата и время, пользователь отправивший изменения, объект сервера, связи объекта - всё это примеры контекстов. | ||
| − | Для эффективной работы с контекстами нужна модель в памяти firefly | + | Для эффективной работы с контекстами, нужна модель в памяти firefly. Для более простых контекстов - текущие дата и время. |
| − | Мутатор - объект трансформирующий сообщение, добавляющий или удаляющий поля в соответствии | + | Мутатор - объект трансформирующий сообщение, добавляющий или удаляющий поля в соответствии с некоторым критерием или без него. |
| − | с некоторым критерием или | ||
| − | |||
| − | |||
| − | |||
Как это работает: | Как это работает: | ||
| Строка 36: | Строка 28: | ||
# Обходим текущие темы сообщений; | # Обходим текущие темы сообщений; | ||
# Каждой теме соответствует единственный, возможно композитный селектор; | # Каждой теме соответствует единственный, возможно композитный селектор; | ||
| − | # Каждое сообщение транзакции проходит проверку на соответствие критериями селектора текущей | + | # Каждое сообщение транзакции проходит проверку на соответствие критериями селектора текущей очереди, и в случае успеха добавляется в массив транзакции для текущей темы; |
| − | очереди и в случае успеха добавляется в массив транзакции для текущей темы; | + | # Когда транзакции для каждой темы сформированы - производится отправка данных (publish); |
| − | # Когда транзакции для каждой темы сформированы производится отправка данных (publish); | ||
| Строка 117: | Строка 108: | ||
'''Пример транзакции из одного изменения проходящего проверку селектором из примера''' | '''Пример транзакции из одного изменения проходящего проверку селектором из примера''' | ||
| − | 1 | + | 1 [ |
| − | 2 | + | 2 { |
| − | 3 | + | 3 "server": "76606d62-a514-11e4-8c37-a7064178f246", |
| − | 4 | + | 4 "txid": 843037, |
| − | 5 | + | 5 "version": 51425717, |
| − | 6 | + | 6 "id": "883c24e2-02cb-4988-8e07-3c8bd24654da", |
| − | 7 | + | 7 "position": "POINT (0.1 0.2)", |
| − | 8 | + | 8 "name": "ip", |
| − | 9 | + | 9 "value": "127.0.0.1", |
| − | 10 | + | 10 "datetime": "2015-09-02 06:24:06.844", |
| − | 11 | + | 11 "types": [ |
| − | 12 | + | 12 "Item", |
| − | 13 | + | 13 "Computer", |
| − | 14 | + | 14 "Object", |
| − | 15 | + | 15 "DuoEthernetDevice", |
| − | 16 | + | 16 "EthernetDevice", |
| − | 17 | + | 17 "PowerConsumer", |
| − | 18 | + | 18 "MssControlable", |
| − | 19 | + | 19 "SpatialObject", |
| − | 20 | + | 20 "BaseObject" |
| − | 21 | + | 21 ], |
| − | 22 | + | 22 "dict": { "a": "b" }, |
| − | 23 | + | 23 "users": [ |
| − | 24 | + | 24 null, |
| − | 25 | + | 25 13, |
| − | 26 | + | 26 5 |
| − | 27 | + | 27 ] |
| − | 28 | + | 28 } |
| − | 29 | + | 29 ] |
'''Пример работы с подписками на селекторах:''' | '''Пример работы с подписками на селекторах:''' | ||
| − | 1. | + | 1. Подписаться на изменения загрузки процессора: |
:1 firefly.WAMP.p_com_integra_open_topic({"$type": "PropertyEqualitySelector","name": "name","value": "cpu_usage"}). | :1 firefly.WAMP.p_com_integra_open_topic({"$type": "PropertyEqualitySelector","name": "name","value": "cpu_usage"}). | ||
| Строка 155: | Строка 146: | ||
:2 then(function(res) { console.log(res); }, function(res) { console.log(res); }); | :2 then(function(res) { console.log(res); }, function(res) { console.log(res); }); | ||
| − | 2. | + | 2. Возвращается имя темы на которую необходимо подписаться: |
:1 firefly.session.subscribe('com.integra.selector_subscriptions.027004e8aed04834bf45bcda18ea2ccf', function(res) { console.log('test sub', res); } ). | :1 firefly.session.subscribe('com.integra.selector_subscriptions.027004e8aed04834bf45bcda18ea2ccf', function(res) { console.log('test sub', res); } ). | ||
| Строка 161: | Строка 152: | ||
:2 then(function(res) { console.log(res); }, function(res) { console.log(res); }) | :2 then(function(res) { console.log(res); }, function(res) { console.log(res); }) | ||
| − | 3. | + | 3. Изменяем любое подходящее значение в базе. Нужно помнить, что изменения из базы больше не вычитаются, и для тестов надо использовать apply_changes: |
:1 firefly.WAMP.p_com_integra_apply_changes('76606d62-a514-11e4-8c37-a7064178f246', [{"id": "4b618576-ed74-413a-919d-a3e127cbe98f","name": "cpu_usage","value" : 77,"datetime": null,"dict": null}]). | :1 firefly.WAMP.p_com_integra_apply_changes('76606d62-a514-11e4-8c37-a7064178f246', [{"id": "4b618576-ed74-413a-919d-a3e127cbe98f","name": "cpu_usage","value" : 77,"datetime": null,"dict": null}]). | ||
| Строка 167: | Строка 158: | ||
:2 then(function(r) { console.log(r); },function(e) { console.log(e); }) | :2 then(function(r) { console.log(r); },function(e) { console.log(e); }) | ||
| − | 4. В консоли должен | + | 4. В консоли должен отобразиться вывод test sub, и далее данные. |
Текущая версия на 13:09, 19 июля 2018
Предпосылка
Усложнение критериев выборки интересующих подписчика событий, например в задачах трекинга необходима подписка по событиям внутри полигона.
Подписки на селекторах должны обеспечить высокую степень управляемости очередей сообщений, обусловленную использованием специальных объектов для конфигурирования очереди, а не компонентов составного имени темы.
Термины
Селектор - объект проверяющий сообщение и/или, его контекст на соответствие некоторому условию, которое, и является сутью селектора. Простые селекторы могут проверять, например, равенство некоторого поля сообщения заданному значению, другие - составные, содержать другие селекторы, и производить над ними операции AND, OR, NOT. То есть - компоновать другие селекторы в дерево булевого выражения.
Сообщение - объект описывающий изменение параметра базы данных
Контекст - объект или свойство объекта не входящее в объект-сообщение, но связанный с ним.
Текущие дата и время, пользователь отправивший изменения, объект сервера, связи объекта - всё это примеры контекстов.
Для эффективной работы с контекстами, нужна модель в памяти firefly. Для более простых контекстов - текущие дата и время.
Мутатор - объект трансформирующий сообщение, добавляющий или удаляющий поля в соответствии с некоторым критерием или без него.
Как это работает:
- Обходим текущие темы сообщений;
- Каждой теме соответствует единственный, возможно композитный селектор;
- Каждое сообщение транзакции проходит проверку на соответствие критериями селектора текущей очереди, и в случае успеха добавляется в массив транзакции для текущей темы;
- Когда транзакции для каждой темы сформированы - производится отправка данных (publish);
Управление темами
- com.integra.open_topic(selector) где selector это сериализованный в JSON селектор.
- Возвращает имя подписки соответствующей переданному селектору при успехе.
- Имя содержит UUID что гарантирует её недоступность для других пользователей.
- com.integra.close_topic(topic_name) где topic_name это имя подписки которое вернулось при открытии темы.
- Возвращает имя подписки при успехе.
- Закрыть подписку может только владелец.
Автоматическое закрытие тем
Если на тему никто не подписался то она закроется через минуту.
Если у подписки были подписчики, а потом все отписались то она закроется автоматически не позже чем через query_timout секунд.
| Наименование типа | Композитный | Параметры |
| PropertyEqualitySelector | нет | name - имя свойства
value - значение свойства |
| AndCompositeSelector | да | массив вложенных селекторов |
| PositionInPolygonSelector | нет | polygon_text - текстовое представление полигона(как в PostgreSQL) |
| ValueInListSelector | нет | name - имя свойства-массива
value - значение |
Пример селектора
1 {
2 "$type": "AndCompositeSelector",
3 "selectors": [
4 {
5 "$type": "PropertyEqualitySelector",
6 "name": "name",
7 "value": "ip"
8 },
9 {
10 "$type": "PropertyEqualitySelector",
11 "name": "value",
12 "value": "127.0.0.1"
13 },
14 {
15 "$type": "PositionInPolygonSelector",
16 "polygon_text": "POLYGON ((0 0, 0 1, 1 1, 1 0, 0 0))"
17 },
18 {
19 "$type": "ValueInListSelector",
20 "name": "users",
21 "value": 5
22 }
23 ]
24 }
Пример транзакции из одного изменения проходящего проверку селектором из примера
1 [
2 {
3 "server": "76606d62-a514-11e4-8c37-a7064178f246",
4 "txid": 843037,
5 "version": 51425717,
6 "id": "883c24e2-02cb-4988-8e07-3c8bd24654da",
7 "position": "POINT (0.1 0.2)",
8 "name": "ip",
9 "value": "127.0.0.1",
10 "datetime": "2015-09-02 06:24:06.844",
11 "types": [
12 "Item",
13 "Computer",
14 "Object",
15 "DuoEthernetDevice",
16 "EthernetDevice",
17 "PowerConsumer",
18 "MssControlable",
19 "SpatialObject",
20 "BaseObject"
21 ],
22 "dict": { "a": "b" },
23 "users": [
24 null,
25 13,
26 5
27 ]
28 }
29 ]
Пример работы с подписками на селекторах:
1. Подписаться на изменения загрузки процессора:
- 1 firefly.WAMP.p_com_integra_open_topic({"$type": "PropertyEqualitySelector","name": "name","value": "cpu_usage"}).
- 2 then(function(res) { console.log(res); }, function(res) { console.log(res); });
2. Возвращается имя темы на которую необходимо подписаться:
- 1 firefly.session.subscribe('com.integra.selector_subscriptions.027004e8aed04834bf45bcda18ea2ccf', function(res) { console.log('test sub', res); } ).
- 2 then(function(res) { console.log(res); }, function(res) { console.log(res); })
3. Изменяем любое подходящее значение в базе. Нужно помнить, что изменения из базы больше не вычитаются, и для тестов надо использовать apply_changes:
- 1 firefly.WAMP.p_com_integra_apply_changes('76606d62-a514-11e4-8c37-a7064178f246', [{"id": "4b618576-ed74-413a-919d-a3e127cbe98f","name": "cpu_usage","value" : 77,"datetime": null,"dict": null}]).
- 2 then(function(r) { console.log(r); },function(e) { console.log(e); })
4. В консоли должен отобразиться вывод test sub, и далее данные.