您可以将序列化消息注入另一个 protobuf 消息吗

Can you inject serialized message into another protobuf message

我们使用 protobuf 编码消息处理 kafka/samza 作业管道。对于某些数据集,管道可能会很长,我们想为管道中的每个阶段添加一个 timestamp/id 以监控效率和服务健康状况。

附加信息将添加到架构中称为接触点的重复字段中。显然在 java/samza 中解码消息,添加附加消息并再次序列化的开销会随着消息的大小而增加(有些可能会非常大,增加反序列化时间),管道的某些部分只是检查过滤器消息密钥,甚至可能根本不需要反序列化,因此这些开销越少越好。

是否可以在不反序列化的情况下将第二条序列化消息注入现有消息,如果是这样,这样做会是非常糟糕的做法吗(我只能认为会)并且是否有更好的解决方案至 deserialize/add/serialize 用于监视消息 path/time 以流向

一般来说,这会非常棘手,并且不能以 "streaming" 的方式完成,原因如下:子消息的前缀是用可变长度整数编码的大小。因此,注入一些东西意味着递归地调整所有父级大小直到根,并且由于大小的可变长度编码,大小更改可能会再次移动内容。

你可以做的一件事来避免这个问题可能是使用固定大小的字段作为时间戳,并确保在第一阶段构建原型时它们被填充了一个值,所以你已经分配了proto 中对应的 space 。这应该允许您使用 CodedInputStream 扫描原型以获得(理想情况下唯一的)时间戳字段 ID,并使用 CodedOutputStream 将修补后的流写回。要做到这一点,仍然需要了解内部格式。我建议首先从一个空的通道 "filter" 开始,并检查输出是否与输入匹配(如果您 运行 遇到任何问题,请更新问题)