Проблема обратной совместимости и неопределенность в реестре схем - PullRequest
1 голос
/ 07 января 2020

У меня есть сценарий использования, где у меня есть JSON, и я хочу сгенерировать схему и записать из JSON и опубликовать sh запись. Я настроил сериализатор значений, и настройка схемы обратно совместима.

Первый JSON

Строка json = "{\ n" +

     "    \"id\": 1,\n" +

     "    \"name\": \"Headphones\",\n" +

     "    \"price\": 1250.0,\n" +

     "    \"tags\": [\"home\", \"green\"]\n" +

     "}\n"
     ;

Зарегистрированная схема версии 1.

Получено сообщение в консоли пользователя avro.

Второй JSON.

String json = "{ \ n "+

    "    \"id\": 1,\n" +

    "    \"price\": 1250.0,\n" +
    "    \"tags\": [\"home\", \"green\"]\n" +
    "}\n"
    ;

Зарегистрированная схема успешно. Отправленное сообщение.

Теперь попытался отправить JSON 1, успешно отправлено

Схема 3:

Строка json = "{\ n" +

    "    \"id\": 1,\n" +
    "    \"name\": \"Headphones\",\n" +

    "    \"tags\": [\"home\", \"green\"]\n" +
    "}\n"
    ;

Получена ошибка для этого случая. Вызывается: io.confluent.kafka.schemaregistry.client.rest.exceptions.RestClientException: регистрируемая схема несовместима с более ранней схемой; код ошибки: 409

Как эта схема, сгенерированная из 2-го JSON, была зарегистрирована, а третья отклонена? Хотя у меня не было ключа по умолчанию для удаленного поля? Это то, что Реестр Схем всегда принимает 1-ю эволюцию? (2-я схема над 1-й)

Схема в реестре схем

Схема версии 1

{"fields": [

{

  "doc": "Type inferred from '1'",

  "name": "id",

  "type": "int"

},

{

  "doc": "Type inferred from '\"Headphones\"'",

  "name": "name",

  "type": "string"

},

{

  "doc": "Type inferred from '1250.0'",

  "name": "price",

  "type": "double"

},

{

  "doc": "Type inferred from '[\"home\",\"green\"]'",

  "name": "tags",

  "type": {

    "items": "string",

    "type": "array"

  }

}
],
"name": "myschema",
"type": "record"   }

Версия 2:

{"поля": [

{

  "doc": "Type inferred from '1'",

  "name": "id",

  "type": "int"

},

{

  "doc": "Type inferred from '1250.0'",

  "name": "price",

  "type": "double"

},

{

  "doc": "Type inferred from '[\"home\",\"green\"]'",

  "name": "tags",

  "type": {

    "items": "string",

    "type": "array"

  }

}
],
"name": "myschema",
"type": "record"   }

1 Ответ

1 голос
/ 08 января 2020

Давайте go по правилам обратной совместимости ... https://docs.confluent.io/current/schema-registry/avro.html#compatibility -типы

Во-первых, значение по умолчанию не является транзитивным, поэтому версия 3 будет рассматривать только версию 2 .

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

Между версиями 1 и 2 вы удалили поле имени, которое является действительным.

Между версией 2 и входящей 3 она думает, что вы пытаетесь опубликовать новую схему, которая удаляет цену (это нормально}, но добавляет обязательное поле имени, что недопустимо.

...