使用 GRPC 流式传输多种类型的最佳方法



我有一个将消息传递给客户端的服务器。消息的类型不同,服务器具有客户端的通用handleMessagepassMessage方法。

现在我打算对此进行调整并使用GRPC。我知道我可以通过在.proto文件中定义服务来公开服务器的所有方法。但是有没有办法:

  • 异构类型
  • 使用一次 RPC 调用
  • 使用 GRPC

oneof允许我设置仅设置了一个属性的消息。我可能有一个oneofMessageContainer,并且我的所有消息类型都包含在此容器中。现在容器只有其中一种类型,我只需要编写一种

service {
rpc messageHandler(ClientInfo)  returns (stream MessageContainer)
}

这样,服务器可以通过一个唯一的接口将多种类型流式传输到客户端。这有意义吗?还是单独公开所有方法更好?

更新

我发现了这个线程,它认为oneof将是要走的路。我显然希望这样做,因为它避免了我必须创建数十个服务和存根。这也将有助于确保它是FIFO设置,而不是多路复用多个流并且不确定哪个消息先出现。但由于某种原因,感觉很脏。

是的,这是有道理的(你所说的MessageContainer最好理解为总和类型)。

。但是,在可以的时候定义不同的方法仍然更好(这里的"更好"意味着"更惯用,更易于系统的未来维护者阅读,并且将来当方法语义需要更改时能够更好地更改")。

是将服务表示为返回总和类型的单个 RPC 方法还是表示为多个 RPC 方法的问题归结为在 RPC 调用时是否可以知道将使用的特定加法类型。当您将request.my_type_determining_field设置为5时,服务器传输的流是否始终包含oneof设置为MyFifthKindOfParticularMessage实例的MessageContainer条消息?如果是这样,那么您可能应该编写一个单独的 RPC 方法来返回MyFifthKindOfParticularMessage消息流。但是,如果在 RPC 调用时您不确定从服务器传输的消息使用的加法类型是什么(并且"同一流中具有不同加法类型的消息"是它的子用例),那么我认为您的服务不可能被分解到不同的 RPC 中,您正确的做法是有一个返回的 RPC 方法总和类型的流。

最新更新