9. Спецификация ПОДД-адаптера - Модуль подписок

9.1. Уведомление о новых данных по подписке

Данная спецификация описывает возможность получения уведомления о новых данных по подписке.

9.1.1. delta.notification

delta.notification - Топик нотификаций ядра о наличии новых дельт.

Структура сообщения

deltaNotificationMessage:
  description: Ответ с ошибкой получения дельты
  schemaFormat: 'application/vnd.apache.avro;version=1.9.0'
  bindings:
    kafka:
      key:
        type: string
        format: uuid
        description: Уникальный идентификатор подзапроса
  headers:
    type: object
    properties:
      AGENT_CONSUMER_ID:
        description: Идентификатор агента потребителя
        type: string
  payload:
    $ref: '#/components/schemas/deltaNotification'
  examples:
    - name: simple
      headers:
        AGENT_CONSUMER_ID: agent-oktmo
      payload:
        requestId: 2e8c8ab2-44db-4dcb-8ae5-2365121b4e14
        subRequestId:
          string: 00000000-0000-0000-0000-000000000000
        datamartMnemonic:
          string: dm
        synId:
          int: 1
        subscriptions:
          - subscriptionId: dcf43fc7-e152-459b-8af5-48d91d4b6a21
            fromId: 100
            deltaKeySize: 1024
            snapshotKeySize: 1024

Avro-схема сообщения

deltaNotification:
  schemaFormat: 'application/vnd.apache.avro;version=1.9.0'
  type: record
  name: DeltaNotificationEvent
  namespace: ru.rtlabs.common.replication.delta
  fields:
    - name: requestId
      description: Уникальный идентификатор запроса
      type:
        type: string
        logicalType: uuid
    - name: subRequestId
      description: Уникальный идентификатор подзапроса
      default: null
      type:
        - 'null'
        - type: string
          logicalType: uuid
    - name: datamartMnemonic
      description: Мнемоника витрины-источника, в которой обновились данные
      default: null
      type:
        - 'null'
        - string
    - name: synId
      description: ДЛЯ РАСПРЕДПОДПИСОК. Id новой дельты
      default: null
      type:
        - 'null'
        - int
    - name: subscriptions
      description: Список всех подписок, для которых есть новые данные
      type:
        type: array
        items:
          type: record
          name: DeltaNotificationSubscription
          fields:
            - name: subscriptionId
              description: Идентификатор подписки, для которой есть новые данные
              type:
                type: string
                logicalType: uuid
            - name: fromId
              description: \use in replicator version 1.1\ Id новой дельты
              default: null
              type:
                - 'null'
                - int
            - name: deltaKeySize
              description: размер ключей дельты в байтах
              default: 0
              type: long
            - name: snapshotKeySize
              description: Размер ключей снапшота в байтах
              default: 0
              type: long

9.2. Запрос первоначальной выгрузки

Данная спецификация описывает возможность запроса дельты изменений по подписке, получения успешного ответа на запрос или ошибки, в случае невозможности выполнения запроса, с описанием причины ошибки.

9.2.1. delta.rq

delta.rq - Топик запросов на получение дельты у поставщика.

Структура сообщения

deltaRequestMessage:
  description: Запрос из ПОДД на получение дельты у поставщика
  schemaFormat: 'application/vnd.apache.avro;version=1.9.0'
  bindings:
    kafka:
      key:
        type: string
        format: uuid
        description: Уникальный идентификатор подзапроса
  headers:
    type: object
    properties:
      AGENT_CONSUMER_ID:
        description: Идентификатор агента потребителя
        type: string
  payload:
    $ref: '#/components/schemas/deltaRequest'
  examples:
    - name: snapshot
      headers:
        AGENT_CONSUMER_ID: agent-oktmo
      payload:
        requestId: 2e8c8ab2-44db-4dcb-8ae5-2365121b4e14
        subRequestId:
          string: 00000000-0000-0000-0000-000000000000
        subscriptionId: dcf43fc7-e152-459b-8af5-48d91d4b6a21
        fromId: null
    - name: delta
      headers:
        AGENT_CONSUMER_ID: agent-oktmo
      payload:
        requestId: 2e8c8ab2-44db-4dcb-8ae5-2365121b4e14
        subRequestId:
          string: 00000000-0000-0000-0000-000000000000
        subscriptionId: dcf43fc7-e152-459b-8af5-48d91d4b6a21
        fromId:
          int: 100

Avro-схема сообщения

deltaRequest:
  schemaFormat: 'application/vnd.apache.avro;version=1.9.0'
  type: record
  name: DeltaRequest
  namespace: ru.rtlabs.common.replication.delta
  fields:
    - name: requestId
      description: Уникальный идентификатор операции, все запрос-ответы в рамках одной операции
      type:
        type: string
        logicalType: uuid
    - name: subRequestId
      description: Идентификатор подзапроса, идентифицирует одно взаимодействие типа запрос-ответ
      default: null
      type:
      - 'null'
      - type: string
        logicalType: uuid
    - name: subscriptionId
      description: Уникальный идентификатор подписки
      type:
        type: string
        logicalType: uuid
    - name: fromId
      description: Идентификатор запрашиваемой дельты.
      default: null
      type:
        - int
        - 'null'

9.2.2. delta.rs

delta.rs - Топик чанков данных дельт репликации от поставщика.

Структура сообщения

deltaResultChunkMessage:
  description: Чанк с данными дельты репликации
  contentType: 'application/octet-stream'
  bindings:
    kafka:
      key:
        $ref: '#/components/schemas/deltaResultChunkKey'
  headers:
    type: object
    properties:
      AGENT_CONSUMER_ID:
        description: Идентификатор агента потребителя
        type: string
  payload:
    description: Бинарные данные чанка
  examples:
    - name: base64
      headers:
        AGENT_CONSUMER_ID: agent_fias
      payload:
        value: JEEJNodyLO7p1pgsRHG9pEiXeYGvHW4YCl4FgrgBmu5C92iVX1PV2GZdcqsb66bx8sk=

Avro-схема сообщения

deltaResultChunkKey:
  schemaFormat: 'application/vnd.apache.avro;version=1.9.0'
  type: record
  name: DeltaResultChunk
  namespace: ru.rtlabs.common.replication.delta
  fields:
    - name: requestId
      description: Уникальный идентификатор запроса
      type:
        type: string
        logicalType: uuid
    - name: subscriptionId
      description: Уникальный идентификатор подписки
      type:
        type: string
        logicalType: uuid
    - name: sql
      description: sql, для которого возвращается дельта
      type: string
    - name: synId
      description: Идентификатор синхронизации витрины
      type: int
    - name: minSynId
      description: Номер первой передаваемой в этом пакете дельты
      type: int
    - name: maxSynId
      description: Номер последней передаваемой в этом пакете дельты
      type: int
    - name: synTime
      description: Время дельты
      type: long
    - name: streamNumber
      description: Номер стрима дланных
      type:
        - int
        - 'null'
    - name: streamTotal
      description: Общее количество стримов
      type:
        - int
        - 'null'
    - name: chunkNumber
      description: Номер порции по порядку
      type: int
    - name: isLastChunk
      description: Признак последнего сообщения
      type: boolean
    - name: replicaHash
      description: Чек-сумма реплики после применения дельты с данным
      type:
        - string
        - 'null'
  examples:
    - requestId: 74e43a84-c6c6-4e25-bac4-9d39c59b3da5
      subscriptionId: a1ba39be-962b-4ac0-b3f3-893151883e59
      sql: 'select * from v1_addrobj'
      synId: 10
      minSynId: 10
      maxSynId: 10
      synTime: 1000
      streamNumber:
        int: 1
      streamTotal:
        int: 1
      chunkNumber: 1
      isLastChunk: true
      replicaHash:
        string: '123456789'
    - requestId: 74e43a84-c6c6-4e25-bac4-9d39c59b3da5
      subscriptionId: a1ba39be-962b-4ac0-b3f3-893151883e59
      sql: 'select * from v1_addrobj'
      synId: 10
      minSynId: 10
      maxSynId: 10
      synTime: 1000
      streamNumber:
        int: 1
      streamTotal:
        int: 1
      chunkNumber: 1
      isLastChunk: false
      replicaHash: null

9.2.3. delta.err

delta.err - Топик c ошибками получения дельт у поставщика.

Структура сообщения

deltaErrorMessage:
  description: Ответ с ошибкой получения дельты у поставщика
  schemaFormat: 'application/vnd.apache.avro;version=1.9.0'
  bindings:
    kafka:
      key:
        type: string
        format: uuid
        description: Уникальный идентификатор подзапроса
  headers:
    type: object
    properties:
      AGENT_CONSUMER_ID:
        description: Идентификатор агента потребителя
        type: string
  payload:
    $ref: '#/components/schemas/deltaError'
  examples:
    - name: simple
      headers:
        AGENT_CONSUMER_ID: agent-oktmo
      payload:
        requestId: 2e8c8ab2-44db-4dcb-8ae5-2365121b4e14
        subRequestId:
          string: 00000000-0000-0000-0000-000000000000
        subscriptionId: dcf43fc7-e152-459b-8af5-48d91d4b6a21
        errorCode: DATAMART-001
        message: Непредвиденная ошибка

Avro-схема сообщения

deltaError:
  schemaFormat: 'application/vnd.apache.avro;version=1.9.0'
  type: record
  name: DeltaError
  namespace: ru.rtlabs.common.replication.delta
  fields:
    - name: requestId
      description: Уникальный идентификатор запроса
      type:
        type: string
        logicalType: uuid
    - name: subRequestId
      description: Уникальный идентификатор подзапроса
      default: null
      type:
        - 'null'
        - type: string
          logicalType: uuid
    - name: subscriptionId
      description: Уникальный идентификатор подписки
      type:
        type: string
        logicalType: uuid
    - name: errorCode
      description: Код ошибки выполнения
      type: string
    - name: message
      description: Сообщение об ошибке
      type: string

9.3. Создание структур для репликации/подписки на уведомления

Данная спецификация описывает возможность запроса на создание таблиц для хранения данных подписки на репликацию в Витрину данных потребителя, получения успешного ответа на запрос или ошибки, в случае невозможности выполнения запроса, с описанием причины ошибки.

9.3.1. replication.in.rq

replication.in - Топик запросов к витрине потребителя на формирование хранилищ реплик.

Структура сообщения

createReplicationStorageRequestMessage:
  description: Запрос к витрине потребителя на формирование хранилища реплик
  schemaFormat: 'application/vnd.apache.avro;version=1.9.0'
  bindings:
    kafka:
      key:
        type: string
        format: uuid
        description: Уникальный идентификатор подзапроса
  headers:
    type: object
    properties:
      AGENT_CONSUMER_ID:
        description: Идентификатор агента потребителя
        type: string
  payload:
    $ref: '#/components/schemas/createReplicationStorageRequest'
  examples:
    - name: replication
      headers:
        AGENT_CONSUMER_ID: agent-oktmo
      payload:
        requestId: 2e8c8ab2-44db-4dcb-8ae5-2365121b4e14
        subRequestId:
          string: 00000000-0000-0000-0000-000000000000
        subscriptionId: dcf43fc7-e152-459b-8af5-48d91d4b6a21
        datamartMnemonic: oktmo
        lastSynId: 10
        table:
          tableId:
            string: 00000000-0000-0000-0000-000000000000
          tableName:
            string: tab
          sql:
          string: select * from v1_addrobj
          fields:
            - name: oktmo
              type: VARCHAR
              length: null
              precision: null
              scale: null
              primaryKey: null
              shardingKey: null

Avro-схема сообщения

createReplicationStorageRequest:
  schemaFormat: 'application/vnd.apache.avro;version=1.9.0'
  type: record
  name: CreateReplicationStorageRequest
  namespace: ru.rtlabs.common.replication.storage
  fields:
    - name: requestId
      description: Уникальный идентификатор запроса регистрации
      type:
        type: string
        logicalType: uuid
    - name: subRequestId
      description: Идентификатор подзапроса, идентифицирует одно взаимодействие типа запрос-ответ
      default: null
      type:
        - 'null'
        - type: string
          logicalType: uuid
    - name: subscriptionId
      description: Уникальный идентификатор подписки
      type:
        type: string
        logicalType: uuid
    - name: datamartMnemonic
      description: Наименование целевого датамарта, приходит в ПОДД в момент регистрации подписки через ЕИП
      type: string
    - name: lastSynId
      description: Последний id синхронизации в витрине
      type: int
      default: 0
    - tables:
      description: Структура таблиц хранения реплик
      default: []
      type:
        type: array
        items:
          type: record
          name: ReplicationTableInfo
          namespace: ru.rtlabs.common.replication.storage
          fields:
            - name: tableId
              description: Идентификатор таблицы
              default: null
              type:
                - 'null'
                - type: string
                  logicalType: uuid
            - name: tableName
              description: Наименование таблицы
              type:
                - 'null'
                - type: string
            - name: sql
              description: sql, для которого должна быть создана таблица
              default: null
              type:
                - 'null'
                - type: string
            - name: fields
              description: Поля таблицы
              type:
                type: array
                items:
                  type: record
                  name: ReplicationFieldInfo
                  namespace: ru.rtlabs.common.replication.storage
                  description: Описание поля таблицы
                  fields:
                    - name: name
                      description: Имя поля
                      type: string
                    - name: type
                      description: Тип поля
                      type: string
                    - name: length
                      description: Максимальная длина строки, если пусто, то нет ограничений
                      type:
                        - int
                        - 'null'
                    - name: precision
                      description: Количество значимых цифр у decimal и numeric. Т.е. количество в целой части + количество в дробной части. Если пусто, то без размера
                      type:
                        - int
                        - 'null'
                    - name: scale
                      description: \use only PODD\ Масштаб decimal и numeric. Т.е. количество значимых цифр в дробной части. Если пусто, то нет дробной части
                      default: null
                      type:
                        - 'null'
                        - int
                    - name: primaryKey
                      description: Порядковый номер поля (начиная с 0) в составе первичного ключа. null - если не входит в состав первичного ключа
                      type:
                        - int
                        - 'null'
                    - name: shardingKey
                      description: Порядковый номер поля (начиная с 0) в составе ключа шардирования. null - если не входит в состав ключа шардирования
                      type:
                        - int
                        - 'null'

9.3.2. replication.in.rs

replication.in.rs - Топик ответов с успешными результатами обработки запроса на формирование структуры хранения реплик.

Структура сообщения

createReplicationStorageResultMessage:
  description: Ответ с успешным результатом обработки запроса на формирование структуры хранения реплик
  schemaFormat: 'application/vnd.apache.avro;version=1.9.0'
  bindings:
    kafka:
      key:
        type: string
        format: uuid
        description: Уникальный идентификатор подзапроса
  headers:
    type: object
    properties:
      AGENT_CONSUMER_ID:
        description: Идентификатор агента потребителя
        type: string
  payload:
    $ref: '#/components/schemas/createReplicationStorageResult'
  examples:
    - name: replication
      headers:
        AGENT_CONSUMER_ID: agent-oktmo
      payload:
        requestId: 2e8c8ab2-44db-4dcb-8ae5-2365121b4e14
        subRequestId:
          string: 00000000-0000-0000-0000-000000000000
        subscriptionId: dcf43fc7-e152-459b-8af5-48d91d4b6a21

Avro-схема сообщения

createReplicationStorageResult:
  schemaFormat: 'application/vnd.apache.avro;version=1.9.0'
  type: record
  name: CreateReplicationStorageResult
  namespace: ru.rtlabs.common.replication.storage
  fields:
    - name: requestId
      description: Уникальный идентификатор операции
      type:
        type: string
        logicalType: uuid
    - name: subRequestId
      description: Идентификатор подзапроса, идентифицирует одно взаимодействие типа запрос-ответ
      default: null
      type:
        - 'null'
        - type: string
          logicalType: uuid
    - name: subscriptionId
      description: Уникальный идентификатор подписки
      type:
        type: string
        logicalType: uuid

9.3.3. replication.in.err

replication.in.err - Топик c ошибками обработки запросов на формирование структуры хранения реплик.

Структура сообщения

createReplicationStorageErrorMessage:
  description: Ответ с ошибкой обработки запроса на формирование структуры хранения реплик
  schemaFormat: 'application/vnd.apache.avro;version=1.9.0'
  bindings:
    kafka:
      key:
        type: string
        format: uuid
        description: Уникальный идентификатор подзапроса
  headers:
    type: object
    properties:
      AGENT_CONSUMER_ID:
        description: Идентификатор агента потребителя
        type: string
  payload:
    $ref: '#/components/schemas/createReplicationStorageError'
  examples:
    - name: simple
      headers:
        AGENT_CONSUMER_ID: agent-oktmo
      payload:
        requestId: 2e8c8ab2-44db-4dcb-8ae5-2365121b4e14
        subRequestId:
          string: 00000000-0000-0000-0000-000000000000
        subscriptionId: dcf43fc7-e152-459b-8af5-48d91d4b6a21
        errorCode: DATAMART-001
        message: Непредвиденная ошибка создания структуры хранения реплик

Avro-схема сообщения

createReplicationStorageError:
  schemaFormat: 'application/vnd.apache.avro;version=1.9.0'
  type: record
  name: CreateReplicationStorageError
  namespace: ru.rtlabs.common.replication.storage
  fields:
    - name: requestId
      description: Уникальный идентификатор операции
      type:
        type: string
        logicalType: uuid
    - name: subRequestId
      description: Уникальный идентификатор идентифицирует одно взаимодействие типа запрос-ответ
      default: null
      type:
        - 'null'
        - type: string
          logicalType: uuid
    - name: subscriptionId
      description: Уникальный идентификатор подписки
      type:
        type: string
        logicalType: uuid
    - name: errorCode
      description: Код ошибки выполнения
      type: string
    - name: message
      description: Сообщение об ошибке
      type: string

9.4. Управление структурой таблиц витрины

Данная спецификация описывает возможность запроса метаданных в Витрину, получения успешного ответа на запрос или ошибки, в случае невозможности выполнения запроса, с описанием причины ошибки.

Запрос структуры таблиц

9.4.1. metadata.rq

Передача Агентом ПОДД запроса метаданных в Витрину.

Формат сообщения

Header

Не используется

Key

текст, содержит requestId, не используется.

Value

Сериализация: в json (см. схему ниже.)

Схема

{
"$schema": "http://json-schema.org/draft-04/schema#",
"type": "object",
"properties": {
        "requestId": {
        "type": "string"
        },
        "datamartMnemonic": {
        "type": "string"
        }
},
"required": [
        "requestId",
        "datamartMnemonic"
]
}

, где:

  • requestId - UUID запроса;

  • datamartMnemonic - мнемоника Витрины данных, к которой адресован запрос.

9.4.2. metadata.rs

Передача Агенту ПОДД ответа на запрос метаданных витрины из Витрины.

Формат сообщения

Header

Не используется

Key

текст, содержит requestId

Value

Сериализация: в json (см. схему ниже.)

Схема

{
"$schema": "http://json-schema.org/draft-04/schema#",
"type": "object",
"properties": {
        "requestId": {
        "type": "string"
        },
        "metadata": {
        "type": "array",
        "items": [
                {
                "type": "object",
                "properties": {
                        "datamart": {
                        "type": "object",
                        "properties": {
                                "id": {
                                "type": "string"
                                },
                                "mnemonic": {
                                "type": "string"
                                },
                                "datamartClassess": {
                                "type": "array",
                                "items": [
                                        {
                                        "type": "object",
                                        "properties": {
                                                "id": {
                                                "type": "string"
                                                },
                                                "mnemonic": {
                                                "type": "string"
                                                },
                                                "label": {
                                                "type": "string"
                                                },
                                                "classAttributes": {
                                                "type": "array",
                                                "items": [
                                                        {
                                                        "type": "object",
                                                        "properties": {
                                                                "id": {
                                                                "type": "string"
                                                                },
                                                                "mnemonic": {
                                                                "type": "string"
                                                                },
                                                                "type": {
                                                                "type": "object",
                                                                "properties": {
                                                                        "id": {
                                                                        "type": "string"
                                                                        },
                                                                        "value": {
                                                                        "type": "string"
                                                                        }
                                                                },
                                                                "required": [
                                                                        "id",
                                                                        "value"
                                                                ]
                                                                }
                                                        },
                                                        "required": [
                                                                "id",
                                                                "mnemonic",
                                                                "type"
                                                        ]
                                                        }
                                                ]
                                                },
                                                "primaryKey": {
                                                "type": "array",
                                                "items": [
                                                        {
                                                        "type": "object",
                                                        "properties": {
                                                                "id": {
                                                                "type": "string"
                                                                },
                                                                "mnemonic": {
                                                                "type": "string"
                                                                },
                                                                "type": {
                                                                "type": "object",
                                                                "properties": {
                                                                        "id": {
                                                                        "type": "string"
                                                                        },
                                                                        "value": {
                                                                        "type": "string"
                                                                        }
                                                                },
                                                                "required": [
                                                                        "id",
                                                                        "value"
                                                                ]
                                                                }
                                                        },
                                                        "required": [
                                                                "id",
                                                                "mnemonic",
                                                                "type"
                                                        ]
                                                        }
                                                ]
                                                }
                                        },
                                        "required": [
                                                "id",
                                                "mnemonic",
                                                "label",
                                                "classAttributes",
                                                "primaryKey"
                                        ]
                                        }
                                ]
                                }
                        },
                        "required": [
                                "id",
                                "mnemonic",
                                "datamartClassess"
                        ]
                        }
                },
                "required": [
                        "datamart"
                ]
                }
        ]
        }
},
"required": [
        "requestId",
        "metadata"
]
}

, где:

  • requestId - UUID запроса;

  • metadata – описание структуры данных;

  • datamart – описание витрины;

  • id – UUID витрины (не используется);

  • mnemonic – имя витрины;

  • datamartClassess – список таблиц витрины;

  • id – UUID таблицы (не используется);

  • mnemonic – имя таблицы;

  • label– не используется;

  • classAttributes – список полей таблицы;

  • id – UUID поля (не используется);

  • mnemonic – имя поля;

  • type – тип данных поля;

  • id – UUID типа данных (не используется);

  • value – название типа данных;

  • primaryKey – список полей, составляющих PK таблицы;

  • id – UUID поля (не используется);

  • mnemonic – имя поля;

  • type – тип данных поля;

  • id – UUID типа данных (не используется);

  • value – название типа данных.

9.4.3. metadata.err

Получение Агентом ПОДД ошибки при обработке запроса метаданных от Витрины.

Формат сообщения

Header

Не используется

Key

текст, содержит requestId

Value

Сериализация: в json (см. схему ниже.)

Схема

{
"$schema": "http://json-schema.org/draft-04/schema#",
"type": "object",
"properties": {
        "requestId": {
        "type": "string"
        },
        "errorCode": {
        "type": "string"
        },
        "msg": {
        "type": "string"
        }
},
"required": [
        "requestId",
        "errorCode",
        "msg"
]
}

, где:

  • requestId - UUID запроса;

  • errorCode – содержит константу INTERNAL;

  • msg – описание ошибки.

Создание структуры таблиц

9.4.4. metadata.newdata.rq

Запрос создание структуры витрины по запросу

Передача Агентом ПОДД запроса на создание таблиц в Витрину.

Формат сообщения

Header

Не используется

Key

текст, содержит requestId, не используется.

Value

Сериализация: в Avro (см. схему ниже.)

Схема

{
"$schema": "http://json-schema.org/draft-04/schema#",
"type": "object",
"properties": {
        "requestId": {
        "type": "string"
        },
        "metadata": {
        "type": "array",
        "items": [
                {
                "type": "object",
                "properties": {
                        "datamart": {
                        "type": "object",
                        "properties": {
                                "id": {
                                "type": "string"
                                },
                                "mnemonic": {
                                "type": "string"
                                },
                                "datamartClassess": {
                                "type": "array",
                                "items": [
                                        {
                                        "type": "object",
                                        "properties": {
                                                "id": {
                                                "type": "string"
                                                },
                                                "mnemonic": {
                                                "type": "string"
                                                },
                                                "label": {
                                                "type": "string"
                                                },
                                                "classAttributes": {
                                                "type": "array",
                                                "items": [
                                                        {
                                                        "type": "object",
                                                        "properties": {
                                                                "id": {
                                                                "type": "string"
                                                                },
                                                                "mnemonic": {
                                                                "type": "string"
                                                                },
                                                                "type": {
                                                                "type": "object",
                                                                "properties": {
                                                                        "id": {
                                                                        "type": "string"
                                                                        },
                                                                        "value": {
                                                                        "type": "string"
                                                                        }
                                                                },
                                                                "required": [
                                                                        "id",
                                                                        "value"
                                                                ]
                                                                }
                                                        },
                                                        "required": [
                                                                "id",
                                                                "mnemonic",
                                                                "type"
                                                        ]
                                                        }
                                                ]
                                                },
                                                "primaryKey": {
                                                "type": "array",
                                                "items": [
                                                        {
                                                        "type": "object",
                                                        "properties": {
                                                                "id": {
                                                                "type": "string"
                                                                },
                                                                "mnemonic": {
                                                                "type": "string"
                                                                },
                                                                "type": {
                                                                "type": "object",
                                                                "properties": {
                                                                        "id": {
                                                                        "type": "string"
                                                                        },
                                                                        "value": {
                                                                        "type": "string"
                                                                        }
                                                                },
                                                                "required": [
                                                                        "id",
                                                                        "value"
                                                                ]
                                                                }
                                                        },
                                                        "required": [
                                                                "id",
                                                                "mnemonic",
                                                                "type"
                                                        ]
                                                        }
                                                ]
                                                }
                                        },
                                        "required": [
                                                "id",
                                                "mnemonic",
                                                "label",
                                                "classAttributes",
                                                "primaryKey"
                                        ]
                                        }
                                ]
                                }
                        },
                        "required": [
                                "id",
                                "mnemonic",
                                "datamartClassess"
                        ]
                        }
                },
                "required": [
                        "datamart"
                ]
                }
        ]
        }
},
"required": [
        "requestId",
        "metadata"
]
}

, где:

  • requestId - UUID запроса;

  • metadata – описание структуры данных; - datamart – описание витрины;

    • id – UUID витрины (не используется);

    • mnemonic – имя витрины;

    • datamartClassess – список таблиц витрины:

      • id – UUID таблицы (не используется);

      • mnemonic – имя таблицы;

      • label – не используется;

      • classAttributes – список полей таблицы;

        • ``id `` – UUID поля (не используется);

        • mnemonic – имя поля;

        • type – тип данных поля; - id ``– UUID типа данных (не используется); - ``value – название типа данных;

      • primaryKey – список полей, составляющих PK таблицы;
        • id – UUID поля (не используется);

        • mnemonic – имя поля;

        • type – тип данных поля;

          • ``id `` – UUID типа данных (не используется);

          • value – название типа данных.

9.4.5. metadata.newdata.rs

Передача Агенту ПОДД ответа на запрос создания структуры таблиц в витрине из Витрины.

Формат сообщения

Header

Не используется

Key

текст, содержит requestId

Value

Сериализация: в json (см. схему ниже.)

Схема

см. metadata.err.

, но:

  • errorCode – содержит константу «SUCCESS»;

  • msg – содержит null.

9.4.6. metadata.newdata.err

Передача Агенту ПОДД ошибки при обработке запроса на создания структуры таблиц в витрине из Витрины.

Формат сообщения

Header

Не используется

Key

текст, содержит requestId

Value

Сериализация: в json (см. metadata.err)

9.5. Запрос на регистрацию репликации

Данная спецификация описывает возможность запроса подписки на репликацию в Витрину - источник данных, получения успешного ответа на создание структуры данных по подписке или ошибки, в случае невозможности выполнения запроса, с описанием причины ошибки.

9.5.1. replication.rq

replication.rq - Топик запросов регистрации подписки репликации у поставщика

Структура сообщения

subscriptionRegistrationRequestMessage:
  description: Запрос регистрации подписки репликации у поставщика
  schemaFormat: 'application/vnd.apache.avro;version=1.9.0'
  bindings:
    kafka:
      key:
        type: string
        format: uuid
        description: Уникальный идентификатор подзапроса
  headers:
    type: object
    properties:
      AGENT_CONSUMER_ID:
        description: Идентификатор агента потребителя
        type: string
  payload:
    $ref: '#/components/schemas/subscriptionRegistrationRequest'
  examples:
    - name: simple
      headers:
        AGENT_CONSUMER_ID: agent-fias
      payload:
        requestId: 00000000-0000-0000-0000-000000000000
        subRequestId:
          string: 00000000-0000-0000-0000-000000000000
        subscriptionId: 00000000-0000-0000-0000-000000000000
        datamartMnemonic: fias
        sql:
          string: select * from v1_addrobj
        queries:
          - id: 00000000-0000-0000-0000-000000000000
            sql: select 1
            type: DATA
        isReplication:
          boolean: true
    - name: multiple
      headers:
        AGENT_CONSUMER_ID: agent-fias
      payload:
        requestId: 00000000-0000-0000-0000-000000000000
        subRequestId:
          string: 00000000-0000-0000-0000-000000000000
        subscriptionId: 00000000-0000-0000-0000-000000000000
        datamartMnemonic: fias
        sql:
          string: select * from v1_addrobj; select * from v1_house
        isReplication:
          boolean: true

Avro-схема сообщения

subscriptionRegistrationRequest:
  schemaFormat: 'application/vnd.apache.avro;version=1.9.0'
  type: record
  name: SubscriptionRegistrationRequest
  namespace: ru.rtlabs.common.replication.subscription
  fields:
    - name: requestId
      description: Уникальный идентификатор запроса регистрации
      type:
        type: string
        logicalType: uuid
    - name: subRequestId
      description: Уникальный идентификатор подзапроса, идентифицирует одно взаимодействие типа запрос-ответ
      default: null
      type:
        - 'null'
        - type: string
          logicalType: uuid
    - name: subscriptionId
      description: Уникальный идентификатор подписки
      type:
        type: string
        logicalType: uuid
    - name: datamartMnemonic
      description: Мнемоника витрины, к которой выполняется запрос
      type: string
    - name: sql
      description: sql запрос текущей подписки для старых витрин тут может приходить массив.
      default: null
      type:
        - 'null'
        - string
    - name: isReplication
      description: \version 1.1\ Признак типа подписки true - подписка на репликацию, false - подписка на уведомления
      default: null
      type:
        - 'null'
        - boolean

9.5.2. replication.rs

replication.rs - Топик с ответами на регистрацию подписки у поставщика

Позитивный ответ на запрос подписки на репликацию передается только в случае, если Витрина успешного обработала все выражения из параметра sql запроса. Один запрос - один ответ. Один ответ - одно сообщение.

Структура сообщения

subscriptionRegistrationResultMessage:
  description: Успешный ответ с результатом регистрации подписки у поставщика. Содержит сведения о структуре таблиц, необходимой для хранения реплик
  schemaFormat: 'application/vnd.apache.avro;version=1.9.0'
  bindings:
    kafka:
      key:
        type: string
        format: uuid
        description: Уникальный идентификатор подзапроса
  headers:
    type: object
    properties:
      AGENT_CONSUMER_ID:
        description: Идентификатор агента потребителя
        type: string
  payload:
    $ref: '#/components/schemas/subscriptionRegistrationResult'
  examples:
    - name: simple
      headers:
        AGENT_CONSUMER_ID: agent-fias
      payload:
        requestId: 2e8c8ab2-44db-4dcb-8ae5-2365121b4e14
        subRequestId:
          string: 00000000-0000-0000-0000-000000000000
        subscriptionId: dcf43fc7-e152-459b-8af5-48d91d4b6a21
        datamartMnemonic: fias
        lastSynId: 10
        snapshotKeySize: 1024
        deltaUuid: 79a928f5-eab5-49ea-a947-2c99fbf39b6e
        tables:
          - tableId: 90722850-b1c7-42eb-836c-b2f88849e22c
            tableName:
              string: tab
            sql: select * from v1_addrobj
            fields:
              - name: oktmo
                type: VARCHAR
                length: null
                precision: null
                scale: null
                primaryKey: null
                shardingKey: null
        tables:
          ru.rtlabs.common.replication.storage.ReplicationTableInfo:
            tableId:
              string: 00000000-0000-0000-0000-000000000000
            tableName:
              string: tab
            sql:
              string: select * from v1_addrobj
            fields:
              - name: oktmo
                type: VARCHAR
                length: null
                precision: null
                primaryKey: null
                scale: null
                shardingKey: null

Avro-схема сообщения

subscriptionRegistrationResult:
  schemaFormat: 'application/vnd.apache.avro;version=1.9.0'
  type: record
  name: SubscriptionRegistrationResult
  namespace: ru.rtlabs.common.replication.subscription
  fields:
    - name: requestId
      description: Уникальный идентификатор запроса
      type:
        type: string
        logicalType: uuid
    - name: subRequestId
      description: Уникальный идентификатор подзапроса,
      default: null
      type:
        - 'null'
        - type: string
          logicalType: uuid
    - name: subscriptionId
      description: Уникальный идентификатор подписки
      type:
        type: string
        logicalType: uuid
    - name: datamartMnemonic
      description: Мнемоника витрины-источника
      type: string
    - name: lastSynId
      description: Последний id дельты примененной в витрине на момент подписки (если дельт нет, то придет -1)
      type: int
    - name: tables
      description: Структура таблиц хранения реплик
      default: []
      type:
        type: array
        items:
          type: record
          name: ReplicationTableInfo
          namespace: ru.rtlabs.common.replication.storage
          fields:
            - name: tableId
              description: Идентификатор таблицы
              default: null
              type:
                - 'null'
                - type: string
                  logicalType: uuid
            - name: tableName
              description: Наименование таблицы
              type:
                - 'null'
                - type: string
            - name: sql
              description: sql, для которого должна быть создана таблица
              default: null
              type:
                - 'null'
                - type: string
            - name: fields
              description: Поля таблицы
              type:
                type: array
                items:
                  type: record
                  name: ReplicationFieldInfo
                  namespace: ru.rtlabs.common.replication.storage
                  description: Описание поля таблицы
                  fields:
                    - name: name
                      description: Имя поля
                      type: string
                    - name: type
                      description: Тип поля
                      type: string
                    - name: length
                      description: Максимальная длина строки, если пусто, то нет ограничений
                      type:
                        - int
                        - 'null'
                    - name: precision
                      description: Количество значимых цифр у decimal и numeric. Т.е. количество в целой части + количество в дробной части. Если пусто, то без размера
                      type:
                        - int
                        - 'null'
                    - name: scale
                      description: Масштаб decimal и numeric. Т.е. количество значимых цифр в дробной части. Если пусто, то нет дробной части
                      default: null
                      type:
                        - 'null'
                        - int
                    - name: primaryKey
                      description: Порядковый номер поля (начиная с 0) в составе первичного ключа. null - если не входит в состав первичного ключа
                      type:
                        - int
                        - 'null'
                    - name: shardingKey
                      description: Порядковый номер поля (начиная с 0) в составе ключа шардирования. null - если не входит в состав ключа шардирования
                      type:
                        - int
                        - 'null'

9.5.3. replication.err

replication.err - Топик c ошибками регистрации подписки у поставщика

Получение Агентом ПОДД ошибки при обработке подписки на репликацию от Витрины.

Негативный ответ на запрос подписки на репликацию - описание причины ошибки, передается только в случае невозможности выполнения запроса. Один запрос - один ответ (об ошибке). Один ответ - одно сообщение.

Структура сообщения

subscriptionRegistrationErrorMessage:
  description: Неуспешный результат регистрации подписки у поставщика
  schemaFormat: 'application/vnd.apache.avro;version=1.9.0'
  bindings:
    kafka:
      key:
        type: string
        format: uuid
        description: Уникальный идентификатор подзапроса
  headers:
    type: object
    properties:
      AGENT_CONSUMER_ID:
        description: Идентификатор агента потребителя
        type: string
  payload:
    $ref: '#/components/schemas/subscriptionRegistrationError'
  examples:
    - name: simple
      headers:
        AGENT_CONSUMER_ID: agent-fias
      payload:
        requestId: 2e8c8ab2-44db-4dcb-8ae5-2365121b4e14
        subRequestId:
          string: 00000000-0000-0000-0000-000000000000
        subscriptionId: dcf43fc7-e152-459b-8af5-48d91d4b6a21
        errorCode: DATAMART-001
        message: Непредвиденная ошибка

Avro-схема сообщения

subscriptionRegistrationError:
  schemaFormat: 'application/vnd.apache.avro;version=1.9.0'
  type: record
  name: SubscriptionRegistrationError
  namespace: ru.rtlabs.common.replication.subscription
  fields:
    - name: requestId
      description: Уникальный идентификатор запроса
      type:
        type: string
        logicalType: uuid
    - name: subRequestId
      description: Уникальный идентификатор подзапроса
      default: null
      type:
        - 'null'
        - type: string
          logicalType: uuid
    - name: subscriptionId
      description: Уникальный идентификатор подписки
      type:
        type: string
        logicalType: uuid
    - name: errorCode
      description: Код ошибки выполнения
      type: string
    - name: message
      description: Сообщение об ошибке
      type: string

9.6. Запрос на отмену репликации

Данная спецификация описывает возможность запроса на отмену подписки на репликацию в Витрину - источник данных, получения успешного ответа на создание структуры данных по подписке или ошибки, в случае невозможности выполнения запроса, с описанием причины ошибки.

9.6.1. replication.cancel.rq

replication.cancel.rq - Топик запросов на отмену подписки у поставщика

Структура сообщения

subscriptionCancelRequestMessage:
  description: Запрос на отмену подписки у поставщика
  schemaFormat: 'application/vnd.apache.avro;version=1.9.0'
  bindings:
    kafka:
      key:
        type: string
        format: uuid
        description: Уникальный идентификатор подзапроса
  headers:
    type: object
    properties:
      AGENT_CONSUMER_ID:
        description: Идентификатор агента потребителя
        type: string
  payload:
    $ref: '#/components/schemas/subsriptionCancelRequest'
  examples:
    - name: simple
      headers:
        AGENT_CONSUMER_ID: agent-fias
      payload:
        requestId: 2e8c8ab2-44db-4dcb-8ae5-2365121b4e14
        subRequestId:
          string: 00000000-0000-0000-0000-000000000000
        subscriptionId: dcf43fc7-e152-459b-8af5-48d91d4b6a21

Avro-схема сообщения

subsriptionCancelRequest:
  schemaFormat: 'application/vnd.apache.avro;version=1.9.0'
  type: record
  name: SubscriptionAgentCancelRequest
  namespace: ru.rtlabs.common.replication.subscription
  fields:
    - name: requestId
      description: Уникальный идентификатор операции
      type:
        type: string
        logicalType: uuid
    - name: subRequestId
      description: Идентификатор подзапроса, идентифицирует одно взаимодействие типа запрос-ответ
      default: null
      type:
        - 'null'
        - type: string
          logicalType: uuid
    - name: subscriptionId
      description: Уникальный идентификатор подписки
      type:
        type: string
        logicalType: uuid

9.6.2. replication.cancel.rs

replication.cancel.rs Топик с ответами на регистрацию подписки у поставщика.

Успешный ответ с результатом регистрации подписки у поставщика. Содержит сведения о структуре таблиц, необходимой для хранения реплик.

Структура сообщения

subscriptionCancelResultMessage:
  description: Ответ с результатом отмены подписки у поставщика
  schemaFormat: 'application/vnd.apache.avro;version=1.9.0'
  bindings:
    kafka:
      key:
        type: string
        format: uuid
        description: Уникальный идентификатор подзапроса
  headers:
    type: object
    properties:
      AGENT_CONSUMER_ID:
        description: Идентификатор агента потребителя
        type: string
  payload:
    $ref: '#/components/schemas/subscriptionCancelResult'
  examples:
    - name: success
      headers:
        AGENT_CONSUMER_ID: agent-fias
      payload:
        requestId: 2e8c8ab2-44db-4dcb-8ae5-2365121b4e14
        subRequestId:
          string: 00000000-0000-0000-0000-000000000000
        subscriptionId: dcf43fc7-e152-459b-8af5-48d91d4b6a21
        success: true
        message: Подписка успешно отменена
    - name: error
      headers:
        AGENT_CONSUMER_ID: agent-fias
      payload:
        requestId: 2e8c8ab2-44db-4dcb-8ae5-2365121b4e14
        subRequestId:
          string: 00000000-0000-0000-0000-000000000000
        subscriptionId: dcf43fc7-e152-459b-8af5-48d91d4b6a21
        success: false
        message: Непредвиденная ошибка отмены подписки

Avro-схема сообщения

subscriptionCancelResult:
  schemaFormat: 'application/vnd.apache.avro;version=1.9.0'
  type: record
  name: SubscriptionAgentCancelResult
  namespace: ru.rtlabs.common.replication.subscription
  fields:
    - name: requestId
      description: Уникальный идентификатор операции
      type:
        type: string
        logicalType: uuid
    - name: subRequestId
      description: Идентификатор подзапроса, идентифицирует одно взаимодействие типа запрос-ответ
      default: null
      type:
        - 'null'
        - type: string
          logicalType: uuid
    - name: subscriptionId
      description: Уникальный идентификатор подписки
      type:
        type: string
        logicalType: uuid
    - name: success
      description: Успешность выполнения отмены подписки
      type: boolean
    - name: message
      description: Сообщения с результатом выполнения операции
      default: null
      type:
        - 'null'
        - string

9.7. Прием данных репликаций

Данная спецификация описывает возможность запроса на прием данных по дельте в Витрину потребителя данных, получения успешного ответа на передачу реплицируемых данных дельты или ошибки при обработке данных, в случае невозможности выполнения передачи данных, с описанием причины ошибки.

9.7.1. delta.in.rq

delta.in - Топик чанков дельт репликации на применение у поставщика.

Структура сообщения

deltaResultChunkMessage:
  description: Чанк с данными дельты репликации
  contentType: 'application/octet-stream'
  bindings:
    kafka:
      key:
        $ref: '#/components/schemas/deltaResultChunkKey'
  headers:
    type: object
    properties:
      AGENT_CONSUMER_ID:
        description: Идентификатор агента потребителя
        type: string
  payload:
    description: Бинарные данные чанка
  examples:
    - name: base64
      headers:
        AGENT_CONSUMER_ID: agent_fias
      payload:
        value: JEEJNodyLO7p1pgsRHG9pEiXeYGvHW4YCl4FgrgBmu5C92iVX1PV2GZdcqsb66bx8sk=

Avro-схема сообщения

deltaResultChunkKey:
  schemaFormat: 'application/vnd.apache.avro;version=1.9.0'
  type: record
  name: DeltaResultChunk
  namespace: ru.rtlabs.common.replication.delta
  fields:
    - name: requestId
      description: Уникальный идентификатор распределенного
      type:
        type: string
        logicalType: uuid
    - name: subRequestId
      description: Уникальный идентификатор подзапроса
      default: null
      type:
        - 'null'
        - type: string
          logicalType: uuid
    - name: sourceDatamart
      description: Наименование датамарта источника
      default: null
      type:
        - 'null'
        - string
    - name: subscriptionId
      description: Уникальный идентификатор подписки
      type:
        type: string
        logicalType: uuid
    - name: synId
      description: Идентификатор синхронизации витрины
      type: int
    - name: sql
      description:sql, для которого возвращается дельта
      default: null
      type:
        - 'null'
        - string
    - name: minSynId
      description: Номер первой передаваемой в этом пакете дельты
      default: null
      type:
        - 'null'
        - int
    - name: maxSynId
      description: Номер последней передаваемой в этом пакете дельты
      default: null
      type:
        - 'null'
        - int
    - name: synTime
      description:Время дельты
      default: 0
      type: long
    - name: streamNumber
      description: Номер стрима данных
      type:
        - int
        - 'null'
    - name: streamTotal
      description: Общее количество стримов
      default: 1
      type:
        - int
        - 'null'
    - name: chunkNumber
      description: Номер порции по порядку
      type: int
    - name: isLastChunk
      description: Признак последнего сообщения
      type: boolean
    - name: replicaHash
      description: Чек-сумма реплики после применения дельты с данным
      default: null
      type:
        - 'null'
        - string
  examples:
    - requestId: 00000000-0000-0000-0000-000000000000
      subRequestId:
        string: 00000000-0000-0000-0000-000000000000
      subscriptionId: 00000000-0000-0000-0000-000000000000
      sourceDatamart:
        string: dm
      sql:
        string: 'select * from v1_addrobj'
      minSynId:
        int: 10
      maxSynId:
        int: 10
      synTime: 1000
      streamNumber:
        int: 1
      streamTotal:
        int: 1
      chunkNumber: 1
      isLastChunk: true
      replicaHash:
        string: '123456789'

9.7.2. delta.in.rs

delta.in.rs - Топик c ответами с подтверждением применения дельты у потребителя.

Структура сообщения

deltaApplyResultMessage:
  description: Ответ с подтверждением применения дельты
  schemaFormat: 'application/vnd.apache.avro;version=1.9.0'
  bindings:
    kafka:
      key:
        type: string
        format: uuid
        description: Уникальный идентификатор подзапроса
  headers:
    type: object
    properties:
      AGENT_CONSUMER_ID:
        description: Идентификатор агента потребителя
        type: string
  payload:
    $ref: '#/components/schemas/deltaApplyResult'
  examples:
    - name: simple
      headers:
        AGENT_CONSUMER_ID: agent-oktmo
      payload:
        requestId: 2e8c8ab2-44db-4dcb-8ae5-2365121b4e14
        subRequestId:
          string: 00000000-0000-0000-0000-000000000000
        subscriptionId: dcf43fc7-e152-459b-8af5-48d91d4b6a21
        synId: 100

Avro-схема сообщения

deltaApplyResult:
  schemaFormat: 'application/vnd.apache.avro;version=1.9.0'
  type: record
  name: DeltaApplyResult
  namespace: ru.rtlabs.common.replication.delta
  fields:
    - name: requestId
      description: Уникальный идентификатор распределенного запроса
      type:
        type: string
        logicalType: uuid
    - name: subRequestId
      description: Уникальный идентификатор подзапроса
      default: null
      type:
        - 'null'
        - type: string
          logicalType: uuid
    - name: subscriptionId
      description: Уникальный идентификатор подписки
      type:
        type: string
        logicalType: uuid
    - name: synId
      description: Id дельты витрины-потребителя
      type: int

9.7.3. delta.in.err

delta.in.err - Ответ с ошибкой применения дельты. Один ответ на дельту с множеством чанков.

Структура сообщения

deltaApplyErrorMessage:
  description: Ответ с ошибкой применения дельты у потребителя
  schemaFormat: 'application/vnd.apache.avro;version=1.9.0'
  bindings:
    kafka:
      key:
        type: string
        format: uuid
        description: Уникальный идентификатор подзапроса
  headers:
    type: object
    properties:
      AGENT_CONSUMER_ID:
        description: Идентификатор агента потребителя
        type: string
  payload:
    $ref: '#/components/schemas/deltaApplyError'
  examples:
    - name: simple
      headers:
        AGENT_CONSUMER_ID: agent-oktmo
      payload:
        requestId: 2e8c8ab2-44db-4dcb-8ae5-2365121b4e14
        subRequestId:
          string: 00000000-0000-0000-0000-000000000000
        subscriptionId: dcf43fc7-e152-459b-8af5-48d91d4b6a21
        synId: 1
        errorCode: DATAMART-001
        message: Непредвиденная ошибка применения дельты

Avro-схема сообщения

deltaApplyError:
  schemaFormat: 'application/vnd.apache.avro;version=1.9.0'
  type: record
  name: DeltaApplyError
  namespace: ru.rtlabs.common.replication.delta
  fields:
    - name: requestId
      description: Уникальный идентификатор запроса
      type:
        type: string
        logicalType: uuid
    - name: subRequestId
      description: Уникальный идентификатор подзапроса
      default: null
      type:
        - 'null'
        - type: string
          logicalType: uuid
    - name: subscriptionId
      description: Уникальный идентификатор подписки
      type:
        type: string
        logicalType: uuid
    - name: synId
      description: \use in replicator version 1.1\Номер дельты, на которой возникла ошибка
      default: null
      type:
        - 'null'
        - int
    - name: errorCode
      description: Код ошибки выполнения
      type: string
    - name: message
      description: Сообщение об ошибке
      type: string