Реестр схемы Кафки не совместим в той же теме
Я использую реестр схемы 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 Тело : { «совместимость»: «НЕТ» }
Это исправление решило проблему для меня