【问题标题】:Using different message types in one gRPC request在一个 gRPC 请求中使用不同的消息类型
【发布时间】: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


    【解决方案1】:

    很难说哪个是最好的,因为它们各有优缺点。但是,一般而言,建议在这种情况下使用多个 rpc 调用,因为客户端很清楚如何使用它们,并且以后易于扩展它们。不过,您仍然可以将其中一些组合成带有可选参数的 rpc。一旦您为每条消息设置了多个 RPC,您就可以创建一个通用的处理程序来避免重复代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-12-07
      • 2018-05-31
      • 2021-09-10
      • 2021-05-22
      • 1970-01-01
      • 2023-03-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多