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

问题描述:

我们使用protobuf编码消息处理kafka/samza作业的管道。对于某些数据集,流水线可能相当长,我们希望为流水线中的每个阶段添加时间戳/ id以监视效率和服务健康状况。您可以将序列化消息注入另一个protobuf消息中吗

附加信息将被添加到架构中称为接触点的重复字段。显然,在java/samza中解码消息,添加附加消息并再次序列化具有随消息大小而增加的开销(一些可能相当大,增加了反序列化时间),管道的某些部分仅仅是检查消息的过滤器关键,甚至可能甚至不需要反序列化,所以这些上的开销越小越好。

是否有可能在不反序列化的情况下将第二个序列化消息注入到现有消息中,如果是的话这是非常糟糕的做法(我只能认为会这样),是否有更好的解决方案,反序列化/添加/序列化以监视消息路径/流程的时间

一般来说,这将是非常棘手的,并且由于以下原因无法以“流式传输”方式完成:子消息的前缀大小为编码在一个可变长度的整数。因此,注入某些内容意味着将所有父级大小递归调整到根,并且由于大小的可变长度编码,大小更改可能会再次移动内容。

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

+0

完全忘记了消息大小前缀确实复杂有一点关系。由于我们不知道消息可能具有的阶段数量,因此不确定固定值是否可行。将为一个lib创建一个好的未来项目,所以我将来可能会回来。欢呼的信息! –