Транспортный формат 4.0#
Транспортный формат 4.0 – это формат передачи векторов изменений между технологическими сервисами платформы.
Внимание!
В примерах описаны структуры JSON-документов каждого элемента, значения полей в этих примерах даны для ознакомления и не должны использоваться в исходном виде.
Контейнер#
Контейнер содержит служебную информацию об отправителе, транзакции, заголовках отправителя и массив с данными для принимающей системы.
Пример контейнера:
{
"type": "hibernate-se",
"txId": "fc66d610-944d-4f85-8188-18441764d508",
"headers": {
"txTimestamp": 904000000,
"rootClass": "com.sbt.pprb.integration.tests.standin.entity.Owner",
"rootId": "e873ec23-5177-4794-b7ce-9c1a27416013",
"rootVersion": 0,
"headerName": "header value"
},
"partitions": [
{
"type": "ORM_CV",
"payload": <content>
}
]
}
Список Атрибутов:
Поле |
Тип |
Описание |
Принимаемое значение |
Функциональность |
|---|---|---|---|---|
|
string |
Тип контейнера |
Название системы, формирующей векторы изменений |
Позволяет определить систему отправителя, тип контейнера и наличие специфичных для отправителя заголовков |
|
string |
Идентификатор физической транзакции в БД |
Любое |
Уникальный идентификатор транзакции. Как правило, заполняется случайным UUID |
|
object |
Дополнительные заголовки |
Объект с произвольными атрибутами |
Элемент |
|
number |
Отметка времени коммита транзакции |
Любое |
Заполняется как timestamp - количество миллисекунд, прошедших с отметки времени |
|
string |
Имя корневой сущности |
Любое |
Заполняется при использовании глобального версионирования. Как правило, это full qualified class name. Подробнее об этом в примечаниии |
|
string |
Идентификатор корневой сущности |
Любое |
Заполняется при использовании глобального версионирования. Более подробная информация приведена в примечаниях |
|
number |
Версия корневой сущности |
Любое |
Монотонно возрастающая последовательность, изменяющаяся с каждым обновлением в БД любой сущности, входящей в агрегат. Заполняется при использовании глобального версионирования. Более подробная информация приведена в примечаниях |
|
array |
Список партиций, содержащих данные |
- |
Более подробная информация приведена в описании атрибутов элемента списка partitions |
Описание атрибутов элемента списка partitions:
Атрибут |
Тип |
Описание |
Принимаемое значение |
Комментарий |
|---|---|---|---|---|
|
string |
Тип партиции |
|
Короткий идентификатор, по которому можно определить семантику данных в партиции. Тип партиции для передачи вектора изменений - |
|
string |
Данные партиции |
|
Подобнее об этом в разделе «Тип ORM_CV» |
Примечание
Тип и контент элементов списка
partitionsмогут быть любого формата при условии, что читающая система способна разобрать этот формат. Для передачи векторов изменений должен использоваться типORM_CVи формат, описанный ниже.Для обеспечения правильного порядка обработки изменений информация об изменениях включает номер версии объекта.
Подходы к версионированию:
Версионирование сущностей: у каждой сущности есть собственная версия. В этом случае заголовки
rootId,rootVersionиrootClassнеобязательны, а в каждом событии изменения обязательно заполняются атрибутыversionиpreviousVersionдля события обновления. При каждом изменении сущности ее версия должна быть поднята на 1. В событиях обновления должна быть указана предыдущая версия этой сущности и новая версия. Читающие системы проверяют соответствие предыдущей версии сущности с той версией сущности, которая была обработана в последний раз. Если эти версии не совпадают, вектор отбрасывается как ошибочный.Глобальное версионирование: версия есть только у корневого объекта в иерархии. Любое изменение как корневого, так и дочернего объекта изменяет версию корневого объекта. При любом изменении версия корневого объекта должна подниматься на 1. В этом случае заполняются атрибуты
rootId(идентификатор корневого объекта),rootClass(класс корневого объекта) иrootVersion(новая версия корневого объекта). ПоляversionиpreviousVersionв векторах изменений не обязательны к заполнению. Читающая система перед обработкой вектора проверяет, что текущая версия корневого объекта на 1 меньше, чем значениеrootVersion, и после обработки вектора устанавливает версию корневого объекта в значение, переданное вrootVersion. Допускается только одна корневая сущность в векторе изменений. Изменение корневой сущности для уже существующих объектов не допускается. После создания сущности она всегда должна передаваться вместе с той корневой сущностью, с которой была создана.
Пользователь отвечает за согласованность версий и передачу векторов изменений в том порядке, в котором версии останутся согласованными.
Тип ORM_CV#
Содержит информацию о сериализаторе и сериализованный вектор изменений.
Пример ORM_CV-контента:
{
"serializerInfo": {
"id": "3375153340802439707",
"name": "json_gson",
"format": "JSON"
},
"data": //вектор изменений
}
Список атрибутов:
Поле |
Тип |
Описание |
Принимаемое значение |
Комментарий |
|---|---|---|---|---|
|
object |
Информация об используемом сериализаторе |
|
Подробнее об этом в описании полей элемента |
|
object |
Сериализованные данные |
JSON / строка |
Подробнее об этом в примечании, следующем за описанием полей |
Описание полей serializerInfo
Поле |
Тип |
Описание |
Принимаемое значение |
Комментарий |
|---|---|---|---|---|
|
string |
Идентификатор сериализатора |
Любое |
Заполняется только автоматически. Подробнее об этом в примечании под таблицей |
|
string |
Имя сериализатора |
Любое |
Заполняется только автоматически. Подробнее об этом в примечании под таблицей |
|
string |
Формат данных |
|
Значение |
Примечание
При использовании библиотеки HibernateSE поля
idиnameзаполняются автоматически. Если эти поля не заполнены, полеformatможет принять только JSON-формат значение.При формировании вектора без использования HibernateSE допустим только JSON-формат, при этом поля
idиnameне заполняются.
Вектор изменений#
Содержит список изменений сущностей, произошедших в транзакции.
Пример вектора изменений:
{
"type" : "DELTA",
"changeSets": [
{
"createEvents": [
<события создания>
],
"updateEvents": [
<события обновления>
],
"deleteEvents": [
<события удаления>
]
}
]
}
Список атрибутов:
Поле |
Тип |
Описание |
Принимаемое значение |
Комментарий |
|---|---|---|---|---|
|
string |
Тип вектора изменений |
|
Указывает на подход к формированию вектора изменений. |
|
array |
Список наборов изменений |
- |
Набор изменений представляет собой серию операций с сущностями, соответствующих одной операции сброса данных в БД (вызов |
Описание полей списка changeSets
Поле |
Тип |
Описание |
Принимаемое значение |
Комментарий |
|---|---|---|---|---|
|
array |
Список событий создания сущности |
- |
Событие создания сущности описывает операцию вставки записи в БД. |
|
array |
Список событий обновления сущности |
- |
Событие обновления сущности описывает операцию модификации записи в БД. |
|
array |
Список событий удаления сущности |
- |
Событие удаления сущности описывает операцию удаления записи из БД. Подробнее об этом в |
Событие создания сущности#
Описывает операцию создания новой сущности и добавления новой записи в СУБД.
Пример события:
{
"alias": "com.sbt.pprb.integration.tests.standin.entity.Product",
"id": "28d76d3d-d704-4df2-a0a4-28bd02915b3e",
"version": 0,
"primitives": {
"field1": "testProduct",
"field2": null
},
"references": {
"owner": "1f583171-07d7-4cd0-99cc-b2d404a0ce5c"
},
"primitiveCollections": {
"attributes": [
"item1",
"item2"
]
},
"referenceCollections": {
"linkedProducts": [
"bc0c2293-065f-4157-b93f-c49be51e4561"
]
}
}
Список атрибутов:
Поле |
Тип |
Описание |
Принимаемое значение |
Комментарий |
|---|---|---|---|---|
|
string |
Имя сущности |
Любое |
|
|
string | number |
Идентификатор сущности |
Любое |
|
|
number |
Версия сущности |
Любое |
Значение версии должно увеличиваться при каждом изменении сущности |
|
object |
Значение полей примитивного типа |
Объект, в котором имя атрибута соответствует имени поля, а его значение — значению поля |
- |
|
object |
Значение полей ссылочного типа |
Объект, в котором имя атрибута соответствует имени поля, а его значение — идентификатору сущности, на которую ссылается поле |
- |
|
object |
Значение списочных полей примитивного типа |
Объект, в котором имя атрибута соответствует имени поля, а его значение — список значений базового типа |
- |
|
object |
Значение списочных полей ссылочного типа |
Объект, в котором имя атрибута соответствует имени поля, а его значение — список идентификаторов, соответствующих сущностям в коллекции |
- |
Событие обновления сущности#
Описывает операцию изменения существующей сущности и изменение записи в СУБД.
Пример события:
{
"alias": "com.sbt.pprb.integration.tests.standin.entity.Product",
"id": "0a4d45e2-94eb-4066-a423-ecfa4c0be983",
"version": 1,
"previousVersion": 0,
"primitiveChanges": {
"name": "updatedName"
},
"referenceChanges": {
"owner": "75cc4469-325a-43a3-8350-e44d3f771532"
},
"primitiveCollectionsChanges": {
"attributes": {
"isCleared": false,
"added": [
"item2",
"item3"
],
"removed": [
"item1"
]
}
},
"referenceCollectionsChanges": {
"linkedProducts": {
"isCleared": false,
"added": [
"bc0c2293-065f-4157-b93f-c49be51e4561"
],
"removed": [
"4982edae-4ce8-4d2c-b54e-10105dc95796"
]
}
}
}
Список атрибутов:
Поле |
Тип |
Описание |
Принимаемое значение |
Комментарий |
|---|---|---|---|---|
|
string |
Имя сущности |
Любое |
|
|
string | number |
Идентификатор сущности |
Любое |
- |
|
number |
Версия сущности |
Любое |
Значение версии должно увеличиваться при каждом изменении сущности |
|
number |
Старое значение версии |
Любое |
Значение должно быть равно версии сущности, предшествовавшей операции обновления |
|
object |
Новые значения полей примитивного типа |
Объект, в котором имя атрибута соответствует имени поля, а его значение — значению поля |
- |
|
object |
Объект, в котором имя атрибута соответствует имени поля, а его значение — идентификатору сущности, на которую ссылается поле |
- |
|
|
object |
Новые значения списочных полей примитивного типа |
Объект, в котором имя атрибута соответствует имени поля, а его значение — элемент модификация коллекции |
Более подробная информация приведена в описании атрибутов элемента модификации коллекции |
|
object |
Объект, в котором имя атрибута соответствует имени поля, а его значение — элемент модификация коллекции |
Более подробная информация приведена в описании атрибутов элемента модификация коллекции |
Список полей элемента события
Поле |
Тип |
Описание |
Принимаемое значение |
Комментарий |
|---|---|---|---|---|
|
boolean |
Флаг сброса коллекции |
Любое |
Установка флага в |
|
array |
Список добавленных элементов или Snapshot коллекции (при установке флага |
- |
- |
|
array |
Список удаленных элементов |
- |
- |
Событие удаления сущности#
Описывает операцию удаления существующей сущности и удаление записи в СУБД. Под удалением понимается физическое удаление, прикладное удаление, перенос в архив и прочее.
Пример события:
{
"alias": "com.sbt.pprb.integration.tests.standin.entity.Product",
"id": "e873ec23-5177-4794-b7ce-9c1a27416013",
"version": 0
}
Список атрибутов:
Поле |
Тип |
Описание |
Принимаемое значение |
Комментарий |
|---|---|---|---|---|
|
string |
Имя сущности |
Любое |
|
|
string | number |
Идентификатор сущности |
Любое |
- |
|
number |
Версия сущности |
Любое |
Значение версии сущности на момент операции удаления |
Событие снимка сущности#
Описывает операцию создания или обновления сущности и представляет собой снимок сущности с перечислением всех полей и значений.
Примечание
Событие снимка сущности, в отличие от других, может примениться, даже если одно из событий было пропущено вследствие нарушения порядка.
{
"alias": "com.sbt.pprb.integration.tests.standin.entity.Product",
"id": "28d76d3d-d704-4df2-a0a4-28bd02915b3e",
"version": 0,
"primitives": {
"field1": "testProduct",
"field2": null
},
"references": {
"owner": "1f583171-07d7-4cd0-99cc-b2d404a0ce5c"
},
"primitiveCollections": {
"attributes": [
"item1",
"item2"
]
},
"referenceCollections": {
"linkedProducts": [
"bc0c2293-065f-4157-b93f-c49be51e4561"
]
}
}
Список атрибутов:
Атрибут |
Тип |
Описание |
Принимаемое значение |
Комментарий |
|---|---|---|---|---|
|
string |
Имя сущности |
Любое |
|
|
string | number |
Идентификатор сущности |
Любое |
|
|
number |
Версия сущности |
Любое |
Значение версии должно увеличиваться при каждом изменении сущности |
|
object |
Значение полей примитивного типа |
Объект, в котором имя атрибута соответствует имени поля, а его значение — значению поля |
- |
|
object |
Значение полей ссылочного типа |
Объект, в котором имя атрибута соответствует имени поля, а его значение — идентификатору сущности, на которую ссылается поле |
- |
|
object |
Значение списочных полей примитивного типа |
Объект, в котором имя атрибута соответствует имени поля, а его значение — список значений базового типа |
- |
|
object |
Значение списочных полей ссылочного типа |
Объект, в котором имя атрибута соответствует имени поля, а его значение — список идентификаторов, соответствующих сущностям в коллекции |
- |
Передача значений встраиваемых типов и составных идентификаторов#
Составные идентификаторы и значения встраиваемых типов передаются как Json Object, где имена полей соответствуют именам атрибутов, а значения полей — значению соответствующих атрибутов. Значения встраиваемых типов считаются примитивами.
Пример события:
"id": {
"compositeIdField1": 1111,
"compositeIdField2": "ATTRIBUTE"
}
"primitives": {
"embeddedValue": {
"embeddedField1": 2222,
"embeddedField2": "ATTRIBUTE"
}
}
Передача даты и времени#
Дата и время, включая timestamp, передаются сериализованными в строку в ISO-8601-формате. Формат указывается в атрибуте serializerInfo.