gRPC消息建模的最佳方法

问题描述 投票:1回答:1

我想为双向流的消息建模。在两个方向上,我可以期待不同类型的消息,我不知道什么是更好的做法。目前的两种想法。

message MyMessage {
    MessageType type = 1;
    string payload = 2;
}

在这种情况下,我会用一个枚举来定义消息的类型 还有一个JSON有效载荷,它将被序列化和反序列化到客户端和服务器端的模型中。第二种方法是。

 message MyMessage {
    oneof type {
        A typeA = 1;
        B typeB = 2;
        C typeC = 3;
    }
}

在第二个例子中,一个oneof被定义为只能设置一个消息类型。双方必须在每种情况下进行切换(A、B、C或None)。

protocol-buffers grpc data-modeling
1个回答
1
投票

如果你提前知道所有可能的类型,使用 oneof 将是你所描述的方式。

使用协议缓冲区的主要原因是模式定义。通过模式定义,你可以得到类型、代码生成、安全的模式演化、高效的编码等。有了 oneof 方法,您将为您的嵌套有效载荷获得这些好处。

我不建议使用 string payload 因为在实际的有效载荷中使用字符串会消除许多使用协议缓冲区的好处。另外,即使你不需要switch语句来反序列化有效载荷,你也很可能在某些时候需要一个switch语句来使用数据(除非你只是把数据转发到其他系统)。

其他选项

如果您不提前知道可能的类型,您可以使用的是 Any 类型来嵌入一个任意的协议缓冲区消息到你的消息中。

import "google/protobuf/any.proto";

message MyMessage {
  google.protobuf.Any payload = 1;
}

缓冲区的 Any 信息基本上就是你的 string payload 方法,但使用字节而不是字符串。

message Any {
  string type_url = 1;
  bytes value = 2;
}

使用 Any 相比之下,具有以下优势 string payload:

  • 鼓励使用协议缓冲区来定义动态有效载荷内容。
  • 每个语言的协议缓冲库中的工具,用于将协议缓冲区消息打包和解包到协议缓冲区中。Any 类型

更多关于 Any,见。

© www.soinside.com 2019 - 2024. All rights reserved.