Google Pub/Sub主题配置含动态JSON字段的Protobuf Schema失败的问题咨询
Google Pub/Sub主题配置含动态JSON字段的Protobuf Schema失败的问题咨询
我来帮你梳理下这个问题的原因和解决方案哈~
你遇到的报错Invalid schema message: (eventParams) e: Cannot find field.,核心原因是你自定义的Struct和Value类型,和Google Pub/Sub在消息验证时默认兼容的标准Protobuf类型不匹配。你自己实现了一套处理动态结构的类型,但Pub/Sub并不能识别这套自定义类型对应的JSON动态字段映射,所以解析eventParams里的e这类动态字段时,会认为字段不存在。
最优解决方案:使用官方的google.protobuf.Struct类型
Protobuf本身就提供了专门处理动态JSON结构的标准类型——google.protobuf.Struct,Pub/Sub原生支持这个类型的消息验证和解析,完全适配你的动态eventParams场景。你只需要修改你的Schema,替换自定义的Struct/Value定义,改用官方标准类型即可:
syntax = "proto3"; import "google/protobuf/struct.proto"; message Event { string original = 1; } message Test { optional Event event = 1; optional string eventName = 2; optional google.protobuf.Struct eventParams = 3; optional string eventTimestamp = 4; optional string eventUUID = 5; optional string sessionID = 6; optional string userID = 7; }
这样修改后,你测试用的JSON消息不需要做任何调整,Pub/Sub就能正确解析eventParams里的动态字段了——因为google.protobuf.Struct天生就是用来映射任意JSON对象的,它内部已经实现了动态字段的处理逻辑,完全符合你的需求。
其他可选方案(不推荐)
如果出于某些原因不想使用官方Struct类型,还有两个备选方向,但都有明显缺陷:
- 用
bytes类型存储eventParams:把动态JSON序列化成字节串后存入eventParams,但这样会失去Schema对eventParams内容的验证能力,也无法利用Pub/Sub的Schema相关特性。 - 用
google.protobuf.Any类型:可以存储任意Protobuf消息,但需要提前知道可能的消息类型,不符合你“完全动态”的场景,使用起来也更复杂。
所以综合来看,使用官方的google.protobuf.Struct是最适合你的方案,既能满足动态JSON字段的需求,又能正常通过Pub/Sub的Schema验证。
备注:内容来源于stack exchange,提问作者Hamza Mogni
相关产品推荐
相关产品推荐

