Реестр схемы Кафки не совместим в той же теме

Я использую реестр схемы Kafka для создания / потребления сообщений Kafka, например, у меня есть два поля, оба они имеют строковый тип, псевдо-схема, как показано ниже:

{"name": "test1", "type": "string"}
{"name": "test2", "type": "string"}

но после отправки и использования некоторого времени мне нужно изменить схему, чтобы изменить второй тип поля на тип long, затем он выдал следующее исключение:

Schema being registered is incompatible with an earlier schema; error code: 409

Я запутался, если реестр схемы не может эволюционировать / обновить схему, то зачем мне использовать реестр схемы или сказать, почему я использую Avro?

5 ответов

Существует известная ошибка (проблема № 518), которая в настоящее время открыта в репозитории github. В качестве обходного пути вы можете изменить правила совместимости для реестра схемы.

Согласно документам:

Сервер реестра схем может применять определенные правила совместимости при регистрации новых схем в теме. В настоящее время мы поддерживаем следующие правила совместимости.

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

Прямая совместимость: новая схема совместима с прямой, если все предыдущие схемы могут считывать данные, записанные в этой схеме. Прямая совместимость полезна для пользовательских приложений, которые могут работать только с данными в конкретной версии, которая не всегда может быть последней версией.

Полная совместимость: новая схема полностью совместима, если она совместима как с обратной, так и с обратной связью.

Нет совместимости: новая схема может быть любой схемой, если она является допустимой Avro.

настройка compatibility в NONE должен сделать свое дело.

# Update compatibility requirements globally
$ curl -X PUT -H "Content-Type: application/vnd.schemaregistry.v1+json" \
    --data '{"compatibility": "NONE"}' \
    http://localhost:8081/config

И ответ должен быть

  {"compatibility":"NONE"}

Если вам нужна только новая схема, и вам не нужны предыдущие схемы из реестра схем, вы можете удалить старые схемы, как указано ниже:

Я тестировал это с помощью confluent-kafka, и у меня это сработало.

Удаляет все версии схемы, зарегистрированные в теме "Kafka-value".

      curl -X DELETE http://localhost:8081/subjects/Kafka-value

Удаляет версию 1 схемы, зарегистрированной в теме "Kafka-value".

      curl -X DELETE http://localhost:8081/subjects/Kafka-value/versions/1

Удаляет последнюю зарегистрированную схему в теме "Kafka-value".

      curl -X DELETE http://localhost:8081/subjects/Kafka-value/versions/latest

Ссылка: https://docs.confluent.io/platform/current/schema-registry/schema-deletion-guidelines.html

https://docs.confluent.io/current/avro.html Возможно, вам потребуется добавить "default": null.

Вы можете просто добавить такое значение по умолчанию.

{"name": "test3", "type": "string","default": null}

В вашей локальной среде вы можете выполнить это в Postman:

URL : http://localhost:8081/config Метод : PUT Тело : { «совместимость»: «НЕТ» }

Это исправление решило проблему для меня

Другие вопросы по тегам