GCP Pub/Sub中嵌套Record的AVRO Schema消息验证失败问题
GCP Pub/Sub AVRO Schema嵌套Record及Union[Null, Record]验证失败问题解决
一、基础嵌套Record验证失败问题
你第一个示例的Schema存在定义错误:foo字段的type被错误声明为命名int类型,而非嵌套Record结构。AVRO语法允许这种定义(因此Schema能通过Pub/Sub校验),但消息结构与Schema逻辑不匹配,导致验证失败。
修正后的示例1 Schema
若希望嵌套Record的字段名为foo_1,正确的Schema定义应为:
{"type":"record","name":"Avro","fields":[{"name":"foo","type":{"type":"record","name":"FooRecord","fields":[{"name":"foo_1","type":"int"}]}}]}
对应的合法消息保持原有结构即可:
{"foo":{"foo_1":42}}
二、Union[Null, NestedRecord]验证失败问题
此问题源于AVRO JSON编码的严格规范:当Union类型包含null且非null成员为自定义Record时,非null消息必须显式标记Record类型名称,否则Pub/Sub无法识别消息对应的Union成员类型。
解决方案:调整消息结构
发送非null嵌套消息时,需将嵌套对象用Schema中定义的Record名称NestedRecord包裹,合法消息格式如下:
{"foo":{"NestedRecord":{"foo_1":42}}}
而{"foo": null}的格式无需调整,可正常通过验证。
补充说明
AVRO Union类型的JSON编码规则:
- 若值对应Union的第一个类型(此处为
null),可直接编码; - 若值为Union中非第一个的自定义类型,必须用类型全称作为键包裹对应值,让校验器明确识别成员类型。
内容的提问来源于stack exchange,提问作者dmin333
相关产品推荐
相关产品推荐

