我有一个将消息传递给客户端的服务器。消息的类型不同,服务器具有客户端的通用handleMessage
和passMessage
方法。
现在我打算对此进行调整并使用GRPC。我知道我可以通过在.proto
文件中定义服务来公开服务器的所有方法。但是有没有办法:
- 流
- 异构类型
- 使用一次 RPC 调用
- 使用 GRPC
有oneof
允许我设置仅设置了一个属性的消息。我可能有一个oneof
MessageContainer
,并且我的所有消息类型都包含在此容器中。现在容器只有其中一种类型,我只需要编写一种
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 方法总和类型的流。