You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为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ć

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 15:43:21