Confluent SchemaRegistry更新现有Schema报不兼容错误咨询
报错原因
Schema Registry 默认启用*向后兼容(BACKWARD)*校验逻辑,要求新注册的 Schema 必须能正常解析所有历史版本 Schema 写入的存量消息。
你提交的新 Schema 直接删除了v1版本中已定义的Amount(数字类型)、IsPaid(布尔类型)两个字段,存量Kafka消息中普遍携带这两个字段,新Schema校验存量消息时会判定存在未定义的非法字段,因此触发不兼容报错。
正确更新操作
根据业务场景选择对应方案即可:
- 方案1(生产环境优先选择):遵循向后兼容规则调整Schema。保留所有历史版本已上线的字段,仅做新增可选字段、放宽字段类型约束这类不影响存量数据解析的修改。保留原有全部字段的合法注册请求示例:
curl -X POST -H "Content-Type: application/vnd.schemaregistry.v1+json" \ --data '{"schemaType":"JSON","schema":"{\"$schema\":\"http://json-schema.org/draft-04/schema#\",\"type\":\"object\",\"properties\":{\"InvoiceId\":{\"type\":\"integer\"},\"InvoiceNo\":{\"type\":\"string\"},\"Amount\":{\"type\":\"number\"},\"IsPaid\":{\"type\":\"boolean\"}}}"}' \ http://schema-registry-1234567.xx-xxx-1.eee.amazonaws.com:8082/subjects/kafka-2906-value/versions
- 方案2:如果业务侧已经完成上下游逻辑改造,确认字段删除不会影响消费链路,可以先调整对应主题的兼容性等级,再提交新Schema。例如先将该Subject的兼容性设置为
NONE(关闭所有兼容性校验)的执行命令:
curl -X PUT -H "Content-Type: application/vnd.schemaregistry.v1+json" \ --data '{"compatibility": "NONE"}' \ http://schema-registry-1234567.xx-xxx-1.eee.amazonaws.com:8082/config/kafka-2906-value
配置生效后,重新执行原有的Schema注册命令即可完成更新。
- 方案3(仅测试环境适用):直接删除该Subject下的所有历史Schema版本,再重新提交新Schema。生产环境禁止使用该操作,会导致存量消息无法完成Schema校验,引发消费/生产故障。
内容的提问来源于stack exchange,提问作者Padmaraj
相关产品推荐
相关产品推荐

