如何为Protocol Buffer Record消息新增timestamp字段扩展payload?
问题描述
项目背景
我们的项目需要将数据从SQL数据库、对象存储等数据源流式传输至目标端,从源读取并向下游发送的单条数据称为record。底层通过gRPC传输record,采用Protocol Buffer 3消息表示,简化版定义如下:
message Record { string id = 1; google.protobuf.Struct payload = 2; }
核心缺陷
payload依赖的google.protobuf.Struct不支持timestamp类型(该结构仅支持有限的基础值类型),而timestamp是业务场景中的常用数据类型,直接支持它能大幅降低开发者的使用门槛。
备选解决方案
我梳理了三种可行度不同的解决方案:
- 自定义编解码器(Custom marshallers):经调研此方案不可行,因为protobuf的
Struct/Value类型不支持通过自定义编解码逻辑扩展新类型。 - 用特殊结构体模拟timestamp:通过类似
{"type": "timestamp", "value": "12345"}的结构化格式来封装timestamp值。此方案可实现需求,但需要递归遍历payload的所有字段及嵌套字段进行处理,存在性能损耗的顾虑。 - 替换为自定义扩展结构:复制
google.protobuf.Struct和Value的原有定义,新增timestamp类型支持,示例如下:
// 复制自google.protobuf.Struct message MyStruct { map<string, MyValue> fields = 1; } // 复制自google.protobuf.Value message MyValue { // 值的类型 oneof kind { // 空值 NullValue null_value = 1; // 浮点数 double number_value = 2; // 字符串 string string_value = 3; // 布尔值 bool bool_value = 4; // 结构化值 MyStruct struct_value = 5; // 数组值 ListValue list_value = 6; // 新增:时间戳值 Timestamp timestamp_value = 7; } }
此方案不存在性能问题,且理论上具备向后兼容性(保留原字段标签,使用原google.protobuf.Struct的客户端仍可正常发送数据),但这种实现方式感觉有些取巧。
提问
请问哪种方案是解决该问题的最佳选择?
内容的提问来源于stack exchange,提问作者Haris Osmanagić
相关产品推荐
相关产品推荐

