kafka架构注册表在同一主题中不兼容

2w3kk1z5  于 2021-06-07  发布在  Kafka
关注(0)|答案(3)|浏览(453)

我使用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?

m0rkklqb

m0rkklqb1#

无法在中重命名字段 BACKWARD 兼容模式。作为一种解决方法,您可以更改模式注册表的兼容性规则。
根据文件:
在主题中注册新架构时,架构注册表服务器可以强制执行某些兼容性规则。目前,我们支持以下兼容性规则。
向后兼容(默认):如果一个新模式可以用来读取所有以前模式中写入的数据,那么它就是向后兼容的。向后兼容性对于将数据加载到hadoop这样的系统非常有用,因为人们总是可以使用最新的模式查询所有版本的数据。
前向兼容性:如果所有以前的模式都可以读取在此模式中写入的数据,则新模式是前向兼容的。前向兼容性对于只能处理特定版本(可能不总是最新版本)中的数据的使用者应用程序非常有用。
完全兼容:一个新的模式是完全兼容的,如果它是向后和向前兼容的。
不兼容:新模式可以是任何模式,只要它是有效的avro。
设置 compatibilityNONE 应该会成功的。


# Update compatibility requirements globally

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

答案应该是

{"compatibility":"NONE"}

我通常不鼓励将兼容性设置为 NONE 除非绝对必要。

np8igboo

np8igboo2#

https://docs.confluent.io/current/avro.html 您可能需要添加一个“default”:null。
您还可以删除现有的一个,并注册更新的一个。

lf3rwulv

lf3rwulv3#

您可以像这样简单地附加一个默认值。

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

相关问题