【问题标题】:Can you inject serialized message into another protobuf message您可以将序列化消息注入另一个 protobuf 消息吗
【发布时间】:2016-04-22 10:36:22
【问题描述】:

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

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

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

【问题讨论】:

    标签: java protocol-buffers apache-samza


    【解决方案1】:

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

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

    【讨论】:

    • 完全忘记了消息大小前缀,这确实使事情变得有些复杂。不确定固定值是否有效,因为我们不知道消息可能具有或不具有的阶段数。不过,这将为 lib 做一个很好的未来项目,所以我将来可能会回到它。为信息干杯!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多