Kafka 模式注册表在同一主题中不兼容
Posted
技术标签:
【中文标题】Kafka 模式注册表在同一主题中不兼容【英文标题】:Kafka schema registry not compatible in the same topic 【发布时间】:2018-09-22 20:56:28 【问题描述】:我正在使用 Kafka 模式注册表来生成/消费 Kafka 消息,例如我有两个字段,它们都是字符串类型,伪模式如下:
"name": "test1", "type": "string"
"name": "test2", "type": "string"
但是在发送和消费一段时间后,我需要修改架构以将第二个字段更改为长类型,然后它抛出以下异常:
Schema being registered is incompatible with an earlier schema; error code: 409
我很困惑,如果架构注册表不能进化架构升级/更改,那我为什么要使用架构注册表,或者说我为什么要使用 Avro?
【问题讨论】:
【参考方案1】:在BACKWARD
兼容模式下不能重命名字段。作为一种解决方法,您可以更改架构注册表的兼容性规则。
根据docs:
架构注册服务器可以强制执行某些兼容性规则 在主题中注册新模式时。目前,我们支持 以下兼容性规则。
向后兼容(默认):新架构向后兼容 如果它可以用来读取之前所有模式中写入的数据。 向后兼容性对于将数据加载到系统中很有用 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"
除非绝对必要,否则我通常不建议在某个主题上将兼容性设置为 NONE
。
【讨论】:
【参考方案2】:如果您只需要新架构而不需要架构注册表中的先前架构,则可以删除旧架构,如下所述 :
我已经用 confluent-kafka 对此进行了测试,它对我有用
删除在主题“Kafka-value”下注册的所有架构版本
curl -X DELETE http://localhost:8081/subjects/Kafka-value
删除在主题“Kafka-value”下注册的架构版本 1
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
【讨论】:
【参考方案3】:https://docs.confluent.io/current/avro.html 您可能需要添加一个“默认值”:null。
您也可以删除现有的并注册更新的。
【讨论】:
【参考方案4】:您可以像这样简单地附加一个默认值。
"name": "test3", "type": "string","default": null
【讨论】:
那不会给你org.apache.avro.AvroTypeException: Invalid default for field test3: null not a "string"
吗?
是的,它确实是字符串的非字符串默认值:null
github.com/confluentinc/schema-registry/issues/707
向后兼容的甜蜜和简单的事情,谢谢。有效!以上是关于Kafka 模式注册表在同一主题中不兼容的主要内容,如果未能解决你的问题,请参考以下文章
TimeoutException:获取主题元数据Kafka时超时
使用带有kafka引擎的clickhouse进行融合模式注册表身份验证