确定协议缓冲区消息类型的最佳实践

Posted

技术标签:

【中文标题】确定协议缓冲区消息类型的最佳实践【英文标题】:Best practice for determining the type of a protocol buffers message 【发布时间】:2014-09-25 21:59:00 【问题描述】:

我需要序列化和反序列化一系列协议缓冲区消息到字节流和从字节流输出。有一些预先确定的消息类型。编码类型信息的推荐方法是什么,以便我的应用程序可以知道它应该读取哪种类型?

【问题讨论】:

协议缓冲区序列化的结构化数据。您能解释一下为什么您认为需要对序列化数据进行编码吗? 【参考方案1】:

最常用的方法是使用union message。

例如:

message AnyMessage 
    optional Message1 msg1 = 1;
    optional Message2 msg2 = 2;
    ...

然后所有消息都在AnyMessage 容器内进行编码/解码。从 protobuf 2.6 开始,您还可以使用 oneof 说明符,这将确保只设置一个子消息。

【讨论】:

【参考方案2】:

我的建议不分先后:

    包含一个包含 proto 名称 / id 的字段(并在所有 proto 中为其赋予相同的字段编号,例如 1)

    使用self describing message(在页面底部)。在这种情况下,您可以

    将FileDescriptorSet 包含为字段(在您的消息中) 在 java(和其他一些实现)中,您可以将 FileDescriptor 设置为分隔文件中的第一条消息。

    保持 proto 名称较小,并在文件名中使用 proto-name,例如

    salesProto_Store001.bin

    这有几个好处:

    文件格式一目了然 您可以扫描 shell 脚本以查找使用 proto 的位置。 此技术可单独使用,也可与上述 2 结合使用。 此技术可用于任何基于架构的文件(例如 Cobol)。

终于ProtobufEditor

支持自我描述消息

文件描述符是分隔文件中的第一条消息 消息中的第一个字段

有一个搜索功能,它将尝试将 Protobuf 消息中的 字段 与已知的 Proto 定义 文件进行匹配,并为您提供可能匹配的


背景: 如果您不知道,protocol buffers proto 文件可以转换为FileDescriptorSetprotocol buffer 消息 并存储

自我描述信息:

message SelfDescribingMessage 
  // Set of .proto files which define the type.
  required FileDescriptorSet proto_files = 1;

  // Name of the message type.  Must be defined by one of the files in
  // proto_files.
  required string type_name = 2;

  // The message data.
  required bytes message_data = 3;

【讨论】:

以上是关于确定协议缓冲区消息类型的最佳实践的主要内容,如果未能解决你的问题,请参考以下文章

rocketmq最佳实践

Metal 最佳实践:三重缓冲 – 纹理?

RocketMQ消息队列的最佳实践

带结构的 QVector - 性能 + 最佳实践

Vulkan中统一缓冲区的最佳实践

如何将消息插入取决于会话值的视图。 ASP.NET MVC。最佳实践