J'utilise Kafka registre de schéma pour produire/consommer Kafka messages, par exemple j'ai deux champs, ils sont tous les deux de type chaîne, le pseudo-schéma est le suivant:
{"name": "test1", "type": "string"}
{"name": "test2", "type": "string"}
mais après avoir envoyé et consommé un certain temps, j'ai besoin de modifier le schéma pour changer le second fichier en type long, puis il a levé l'exception suivante:
Schema being registered is incompatible with an earlier schema; error code: 409
Je suis confus, si le registre de schéma ne peut pas faire évoluer la mise à niveau/modification du schéma, alors pourquoi devrais-je utiliser le registre de schéma, ou dire pourquoi j'utilise Avro?
Les champs ne peuvent pas être renommés en mode de compatibilité BACKWARD
. Pour contourner ce problème, vous pouvez modifier les règles de compatibilité pour le registre de schéma.
Selon les docs :
Le serveur de registre de schéma peut appliquer certaines règles de compatibilité lorsque de nouveaux schémas sont enregistrés dans un sujet. Actuellement, nous prenons en charge les règles de compatibilité suivantes.
Compatibilité descendante (par défaut): Un nouveau schéma est rétrocompatible s'il peut être utilisé pour lire les données écrites dans tous les schémas précédents. La compatibilité descendante est utile pour charger des données dans des systèmes comme Hadoop, car on peut toujours interroger les données de toutes les versions en utilisant le dernier schéma.
Compatibilité ascendante: Un nouveau schéma est compatible vers l'avant si tous les schémas précédents peuvent lire les données écrites dans ce schéma. La compatibilité ascendante est utile pour les applications grand public qui ne peuvent traiter que des données dans une version particulière qui n'est pas toujours la dernière version.
Compatibilité totale: Un nouveau schéma est entièrement compatible s'il est à la fois compatible en amont et en aval.
Aucune compatibilité: Un nouveau schéma peut être n'importe quel schéma tant qu'il s'agit d'un Avro valide.
Définir compatibility
sur NONE
devrait faire l'affaire.
# Update compatibility requirements globally
$ curl -X PUT -H "Content-Type: application/vnd.schemaregistry.v1+json" \
--data '{"compatibility": "NONE"}' \
http://localhost:8081/config
Et la réponse devrait être
{"compatibility":"NONE"}
https://docs.confluent.io/current/avro.html Vous devrez peut-être ajouter un "défaut": null.
Vous pouvez également supprimer celui existant et enregistrer celui mis à jour.
Vous pouvez simplement ajouter une valeur par défaut comme celle-ci.
{"name": "test3", "type": "string","default": null}