Data Model Service (dms)

Описание

Сервис модели данных домена.
Работает на базе класса сущностей доменного центра `classes` интерпретируя каждый экземпляр как метаданные новой пользовательской/проектной коллекции информационных объектов.
Предоставляет CRUD API для остальных ролей и сервисов для управления экземплярами пользовательских/проектных коллекций. Поддерживает методы `create`, `update`, `replace`, `read` коллекции, `read` элемента коллекции`, `clear` коллекции, `lookup`. В зависимости от метаданных коллекции поддерживает работу со словарем в памяти, с распределенной объектной БД, c сервером PostgreSQL, с KAFKA и колоночной БД Clickhouse. Поддерживает однопоточный, параллельный и асинхронный режимы работы с коллекциями. Способна гарантировать целостность модификации/чтения/уведомления, гарантирует сохранение последовательности модификаций в хранилище и в уведомлениях. Позволяет использовать временный или постоянный кэш для элементов коллекций.

Работает совместно с wssubscr для уведомления подписчиков об изменениях (класс/тип событий `modelevents.data_changed`). Поддерживает подписку с фильтрами и маскировкой. Уведомляет с корректировкой команд с учетом фильтра (например, create вместо update). Выборка данных из коллекции поддерживает сложную фильтрацию, маскировку, сортировку, агрегацию, смещение, лимитирование.

Доступ через HTTP(s) REST API `/rest/v1/model/…​`, где далее имя (или путь) класса. Управление возможно также через Websocket-API как с авторизацией под сессией пользователя, так и через токен.
Доступ к коллекциям и методам определяется раутами вебсервера. По умолчанию администратору доступны все пути и методы, а остальное определяется ролями (класс roles), назначенными пользователю (user.opts.roles) или каналу интеграции (integration_point.opts.roles).

Поддерживает привязку файлов-вложений к сущностям, имеющим свойства типа `attachment` единичного или списочного вида.
Вложения размещаются на указанных в классе хранилищах, подключения к которым настроены с помощью сущностей класса storage с типами, относящимися к файловым хранилищам.

Разделена на микросервисы по доменам.
Резервируется в режиме Active-Passive. Масштабируется разделением доменного дерева.

Table 1. Системные характеристики

Код

dms

Режим работы

Хранилище, сервис

Режим резервирования

Active-Passive

Типы сайтов

Любые

Слой

Бизнес-логика

Размещение

Внутренний

Сохранение и восстановление состояния при перезагрузке

Да, кроме классов типа RAM.

Приложение

era_dms

Собственное хранилище

RAM, Mnesia, PostgreSQL, KAFKA, Clickhouse

Ограничения

  • Доступно в рамках информационно-коммуникационной платформы 'era'.

  • Скорость работы зависит от выбранного типа хранилища коллекции. Достижима скорость работы коллекции до 10 тысяч запросов в секунду.

  • Данные между сайтами ролью не синхронизируются. Слияние через внешние хранилище возможно с поправкой на возможные проблемы целостности и необходимость отключение кэша.

Параметры

Table 2. Параметры
Имя Тип Умолчание Описание

name

str

required

Имя. Может состоять из латинских букв и цифр, должно начинаться с буквы.

roletype

str

required

Тип роли. Возможные значения: "dms".

iface

str

required

Алиас сетевого интерфейса сервера, на котором будет происходить внутреннее взаимодействие ролей между собой.

ext

json

empty

Дополнительные опции роли. Содержит json объект или список.

enabled

bool

empty

Флаг активности роли. При установке в false роль не участвует в валидации и не запускается.

dbconnstrings

array<str>

required

Строки подключения к ферме серверов PostgreSQL БД доменов, где создаются базы данных доменов с хранилищем сущностей продуктовых моделей.
Эти строки подключения используются для классов, имеющих storage_mode: 'category' или 'history', у которых не заданы специфические параметры подключения к БД PostgreSQL, а выставлен режим 'auto' (по умолчанию).

Каждый домен использует пул из 10 подключений к каждой БД (уникальная строка подключения). Новое подключение создается только при занятости. В спокойном режиме подключения к БД отсутствуют.
Каждый домен использует оригинальную указанную строку только для создания собственной БД с уникальным именем 'era_model_%DOMAIN%', а для работы использует модифицированную строку подключения, где в качестве БД подставляет имя своей БД.

Формат строки подключения: "alias://pgdb_strings/<ALIAS_NAME>", где <ALIAS_NAME> – конкретный алиас конфигурации из раздела pgdb_strings.

Перечисление в списке нескольких строк подключения обеспечивает резервный доступ к ферме серверов БД – если подключение через первую строку не удается, производится подключение через вторую и т.д.

На центральном сайте, где располагается роль MDC, при отсутствии этого параметра, для клаccов с режимом 'auto' применятся строки подключения, заданные в параметрах роли mdc.

group

int

required

Номер группы.
В рамках горизонтального масштабирования роль может быть разделена на несколько групп на сайте, в каждой из которых активен только один экземпляр, а остальные зарезервированы.
Ответственность между группами разделяется по доменным множествам. Вместе все группы обслуживают полное доменное множество. Все роли одной группы должны иметь одинаковую ответственность.
Целое число от 1 до 9999999.

order

int

required

Порядок экземпляра роли в рамках группы.
Определяет в каком порядке будет происходить перетекание в режиме Active-Passive.

include_domains

array<str>

empty

Список имен доменов, которые обслуживает данная группа.
Может быть указан любой домен любого уровня. Указание домена приводит к тому, что дерево его поддоменов будет обслуживаться на этой группе и не будет обслуживаться на других группах роли, исключая только те ветви, которые упомянуты в других группах.
В совокупности все группы роли на сайте обслуживают полное дерево доменов.

Пример конфигурации

Управление конфигурацией производится в приложении, доступном для администраторов мастер-домена. Приложение скрывает полное содержание конфигурации, однако тем не менее оно доступно через API.

Конфигурация содержит раздел для описания всех экземпляров всех ролей. Параметры определяются для каждого конкретного экземпляра роли.

Пример узла
{
  "name": "dms1",
  "roletype": "dms",
  "iface": "eth0",

  "group": 11310,
  "order": 1
}