1.5. Представление модели¶
При эксплуатации TDG объекты могут поступить в систему постфактум, а запросы к системе могут быть сделаны по функциональному срезу для определенной бизнес-даты.
Поэтому, чтобы поддерживать обратную совместимость при разработке приложения для TDG, нужно версионировать всё, что непосредственно влияет на логику его работы:
Avro-схему модели (единый формат);
конвейеры обработки входящих объектов;
код Lua-функций, составляющих конвейеры и методы объектов модели;
(потенциально) фабрики объектов;
(потенциально) триггеры;
(потенциально) описание сервисов.
Чтобы поддерживать историчность и эволюцию модели, TDG представляет ее в едином формате — Lua-структуре, состоящей из примитивных типов. Ее легко преобразовать в JSON и обратно для передачи по сети.
Чтобы версионировать собственную структуру, система использует следующие форматы конфигурации для разных целей:
Внутренний формат — для передачи конфигурации по сети;
Экспортный формат — для загрузки начальной модели при первичном старте системы, а также для загрузки конфигурации в тестах;
Экспортный формат бандла (комплекта) модели — для передачи разработчикам.
1.5.1. Внутренний формат конфигурации¶
Узлы кластера передают конфигурацию по сети и хранят ее в следующем формате:
{
"functions": {
"function_name": "function_code"
...
},
"pipelines": {
"pipeline_name": ["function1_name", "function2_name", ...],
...
},
"classifiers": {
"classifier_name": "pipeline_name/function_name",
...
},
"routing": {
"routing_key": "pipeline_name/function_name",
...
},
"storage": {
"routing_key": "type_name"
},
"schema": <avro_schema>
}
где:
functions
— набор функций, которые используются в классификаторах, маршрутизаторах и объектах модели;pipelines
— конвейеры, в которых функции применяются к объекту по цепочке;classifiers
— позволяют получить ключ маршрутизации для объекта;routing
— функции, которые позволяют менять ключ маршрутизации объекта;storage
— хранилище для объектов с соответствующими ключами маршрутизации;function_name
— имя (идентификатор) Lua-функции;function_code
— код Lua-функции (исполняемый в «песочнице»);pipeline_name
— имя конвейера;classifier_name
— имя классификатора;routing_key
— строковый ключ маршрутизации.
Также в формате присутствует поле schema
, формат которого описан в разделе
о доменной модели. В этом поле хранится структурное
(а не строковое) представление доменной модели.
1.5.2. Внешний (экспортный) формат¶
Экспортный формат используется для загрузки начальной модели при первичном старте системы, а также для загрузки конфигурации в тестах.
Экспортный формат соответствует внутреннему, за исключением следующих полей:
Вместо
function_code
—function_file_name
, файл, в котором находится код Lua-функции;Вместо
avro_schema
—avro_file_name
, файл, в котором сериализована Avro-схема модели.
Корневой объект сохраняется в файле config.yml
, код функций — рядом, в соответствующих
файлах с расширением .lua
, а схема — в файле schema.avsc
.
1.5.3. Экспортный формат бандла моделей¶
Экспортный формат бандла (комплекта) может использоваться для удобной передачи разработчикам модели, загруженной в систему. Бандл — папка, содержащая в себе набор моделей, каждая из которых находится в своей подпапке. Подпапки названы по бизнес-времени действия модели (а не по фактическому времени добавления).
Например:
bundle/
├── 2018-01-03T18:56:00Z
| ├── config.yml
| ├── schema.avsc
| ├── function_1.lua
| └── function_2.lua
└── 2018-03-05T00:41:00Z
├── config.yml
├── schema.avsc
└── function_3.lua
Такой экспортный формат содержит только конфигурацию модели, но не содержит конфигурацию топологии системы или связи с внешними системами.