流式传输 protoBuf 消息的设计模式

Posted

技术标签:

【中文标题】流式传输 protoBuf 消息的设计模式【英文标题】:design pattern for streaming protoBuf messages 【发布时间】:2013-11-19 08:47:29 【问题描述】:

我想将 protobuf 消息流式传输到文件中。

我有一个 protobuf 消息

message car 
     ... // some fields

我的 java 代码会创建这个汽车消息的多个对象。

我应该如何将这些消息流式传输到文件中。

据我所知有两种方法。

    有另一条消息,比如汽车

    message cars 
      repeated car c = 1;
    
    

    并让 java 代码创建一个单一的汽车类型对象,然后将其流式传输到文件中。

    只需使用 writeDelimitedTo 函数将汽车消息适当地流式传输到单个文件中即可。

我想知道使用 protobuf 进行流式传输的效率更高。

什么时候应该使用模式 1,什么时候应该使用模式 2?

这是我从https://developers.google.com/protocol-buffers/docs/techniques#large-data得到的

我不清楚他们想说什么。

大型数据集

协议缓冲区不是为处理大消息而设计的。作为一个 一般经验法则,如果您处理的消息大于 每兆字节,可能是时候考虑另一种策略了。

也就是说,Protocol Buffers 非常适合处理单个消息 在一个大数据集中。通常,大型数据集实际上只是一个 小片段的集合,其中每个小片段都可能是结构化的 一块数据。即使协议缓冲区无法处理整个 立即设置,使用 Protocol Buffers 对每一部分进行大幅编码 简化您的问题:现在您只需要处理一组字节 字符串而不是一组结构。

协议缓冲区不包含对大数据的任何内置支持 因为不同的情况需要不同的解决方案。 有时一个简单的记录列表就可以了,而其他时候你可以 想要更像数据库的东西。应开发每个解决方案 作为一个单独的图书馆,因此只有需要的人需要付费 费用。

【问题讨论】:

你不应该寻找设计模式。它们是来自理想代码的东西。您应该问的是“我可以编写此代码的最简单方法是什么?”。如果这恰好是一个设计模式(或关闭),那么就使用它。否则,不要。 @chris Thanx 对于您的回复,我可以两种方式进行编码(如问题中所述)。想知道哪种方法更有效。序列化或反序列化时间、流对象大小方面的效率。 我没有回应,我只是对您的问题进行了一些小的格式更改。 【参考方案1】:

看看Previous Question。大小和时间的任何差异都将是最小的 (选项 1 更快??,选项 2 更小)。

我的建议是:

    大文件的选项 2。您逐条处理消息。 如果需要多种语言,请选择选项 1。过去,并非所有语言都支持分隔,但这种情况似乎正在改变。 其他明智的个人偏好。

【讨论】:

谢谢。你的回答内容丰富。我不知道我怎么错过了另一页:( (***.com/questions/16468369/…)

以上是关于流式传输 protoBuf 消息的设计模式的主要内容,如果未能解决你的问题,请参考以下文章

使用 Protobuf-net 将大数据文件流式传输为 IEnumerable

嵌套 json 中的结构化流式传输不同模式

WCF HttpTransport:流式传输与缓冲传输模式

使用管理 API 将 Protobuf 消息发布到 Pulsar 模式注册表时出现 500 错误

Protobuf 的 Kafka 模式注册表

Bigquery:我们应该在模式更新后等待多长时间才能流式传输数据?