我使用kafka schema registry来生成/使用kafka消息,例如,我有两个字段,它们都是字符串类型,伪模式如下所示:
{"name": "test1", "type": "string"}
{"name": "test2", "type": "string"}
但在发送和使用一段时间后,我需要修改schema以将第二个字段更改为long类型,然后它抛出以下异常:
Schema being registered is incompatible with an earlier schema; error code: 409
我很困惑,如果schema registry不能改进模式升级/更改,那么为什么我要使用schema registry,或者说为什么我要使用avro?
3条答案
按热度按时间m0rkklqb1#
无法在中重命名字段
BACKWARD
兼容模式。作为一种解决方法,您可以更改模式注册表的兼容性规则。根据文件:
在主题中注册新架构时,架构注册表服务器可以强制执行某些兼容性规则。目前,我们支持以下兼容性规则。
向后兼容(默认):如果一个新模式可以用来读取所有以前模式中写入的数据,那么它就是向后兼容的。向后兼容性对于将数据加载到hadoop这样的系统非常有用,因为人们总是可以使用最新的模式查询所有版本的数据。
前向兼容性:如果所有以前的模式都可以读取在此模式中写入的数据,则新模式是前向兼容的。前向兼容性对于只能处理特定版本(可能不总是最新版本)中的数据的使用者应用程序非常有用。
完全兼容:一个新的模式是完全兼容的,如果它是向后和向前兼容的。
不兼容:新模式可以是任何模式,只要它是有效的avro。
设置
compatibility
至NONE
应该会成功的。答案应该是
我通常不鼓励将兼容性设置为
NONE
除非绝对必要。np8igboo2#
https://docs.confluent.io/current/avro.html 您可能需要添加一个“default”:null。
您还可以删除现有的一个,并注册更新的一个。
lf3rwulv3#
您可以像这样简单地附加一个默认值。