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时超时

Protobuf 的 Kafka 模式注册表

没有模式注册表的 Kafka-connect

使用带有kafka引擎的clickhouse进行融合模式注册表身份验证

每个模式的 JDBC Confluent kafka 连接器和主题

如何在消费前获取架构?