如何在Schema Registry中结合ENUM成功实现FULL_TRANSITIVE模式演进
问题原因与解决办法
报错根源
你启用的FULL_TRANSITIVE兼容性模式要求新旧Schema必须双向兼容:
- 旧Schema产出的消息,新Schema得能正常解析;
- 新Schema产出的消息,旧Schema也得能正常解析。
你给枚举新增了added1这个符号,直接打破了双向兼容规则:新生产者可能会发送带added1的消息,但旧的V1 Schema根本不认识这个符号,旧消费者读取时会直接解析失败。所以Schema Registry触发了兼容性校验错误。
可行解决方案
有两种处理方式可选:
- 切换到
BACKWARD_TRANSITIVE兼容性模式
这个模式只要求旧Schema的消息能被新Schema解析,新增枚举符号完全符合要求——旧生产者不会用到新符号,新消费者能识别所有旧符号;如果新生产者用了新符号,旧消费者可以靠你设置的默认值Here兜底处理,模式本身不会阻止你注册新Schema。
用CLI修改的命令示例:curl -X PUT -H "Content-Type: application/vnd.schemaregistry.v1+json" \ --data '{"compatibility": "BACKWARD_TRANSITIVE"}' \ http://你的SchemaRegistry地址/config/com.thing.events.rob.test.EnumEventTest - 坚持使用
FULL_TRANSITIVE模式
这种情况下绝对不能新增枚举符号,因为旧Schema无法识别新符号。你只能在现有枚举符号里调整,或者换个思路——比如把枚举字段改成字符串类型,在业务代码层面做枚举值校验,绕过Schema层面的限制。
内容的提问来源于stack exchange,提问作者RHammonds
相关产品推荐
相关产品推荐

