1

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

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

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

4

1 回答 1

4

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

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

于 2016-04-22T11:14:48.723 回答