【发布时间】:2020-07-09 20:37:42
【问题描述】:
我需要使用 gRPC 从具有不同类型但语义相关的服务器获取一些数据。您可以将其视为可以具有 A、B 和 C 类型的数据。我在考虑将这些数据传输到客户端的正确方法是什么。我个人可以想到三种不同的方法:
- 将单个消息与
oneof一起使用:
在这个方法中,我只定义了一条消息如下:
message MyData {
oneof test_oneof {
DataA a = 1;
DataB b = 2;
DataC c = 3;
}
}
现在我只添加一个可以获取不同类型数据的 rpc 方法。这种方法的问题是可扩展性。我将无法通过将新消息类型 DataD 添加到此 oneof 来更新我的消息,如 here 所述(或者至少这是我所理解的,尽管我认为 oneof 在此限制下将毫无用处)。
- 将单个消息与
Any一起使用:
在这个方法中,我只定义了一条消息如下:
import "google/protobuf/any.proto";
message MyData {
google.protobuf.Any data = 1;
}
在这里,我需要一个 rpc 方法。这种方法也是可扩展的,但缺点是Any类型还在开发中。此外,由于需要反射代码,代码会更复杂。
- 使用多个 rpc 调用:
在这个方法中,我只是为每种数据类型定义了一个 rpc 调用。这种方法也是可扩展的,但它会创建大量类似的代码,我个人完全不喜欢它。我个人认为,由于这些数据在语义上是相关的,因此需要使用单个 rpc 调用来传输它们。
您认为使用 gRPC 和 protobuf 传输这些数据的最佳方法是什么?
【问题讨论】:
标签: c++ protocol-buffers grpc