pas*_*oop 6 python java protocol-buffers grpc
我有一个服务器将消息传递给客户端.消息具有不同类型,服务器具有客户端的通用handleMessage和passMessage方法.
现在我打算对此进行调整并使用GRPC.我知道我可以通过在我的.proto文件中定义服务来公开服务器的所有方法.但是还有一种方法可以:
有oneof一个允许我设置只有一个属性设置的消息.我可以拥有它MessageContainer,oneof并且我的所有消息类型都包含在此容器中.现在容器只有一种类型,我只需要写一个
service {
rpc messageHandler(ClientInfo) returns (stream MessageContainer)
}
Run Code Online (Sandbox Code Playgroud)
这样,服务器可以通过一个唯一的接口将多种类型流式传输到客户端.这有意义吗?或者将所有方法单独暴露是否更好?
UPDATE
我找到了这个争论oneof的方法.我明白这一点,因为它避免了我必须创建潜在的数十个服务和存根.它还有助于确保它是一个FIFO设置,而不是多路复用多个流,而不确定哪个消息首先出现.但由于某种原因它感觉很脏.
小智 2
是的,这是有道理的(您所说的MessageContainer最好理解为sum type)。
...但如果可以的话,最好定义不同的方法(这里的“更好”意味着“更惯用,更容易被系统的未来维护者阅读,并且在将来需要更改方法语义时能够更好地进行更改” )。
将服务表示为返回总和类型的单个 RPC 方法还是多个 RPC 方法的问题归结为在 RPC 调用时是否可以知道将使用的特定加数类型。当您设置为该值时,request.my_type_determining_field服务器5传输的流是否始终包含设置为实例MessageContainer的消息?如果是这样,那么您可能应该编写一个单独的 RPC 方法来返回消息流。但是,如果在 RPC 调用时您不确定从服务器传输的消息所使用的加数类型是什么(并且“同一流中具有不同加数类型的消息”是一个子-use-case),那么我认为您的服务不可能被分解为不同的 RPC,而您应该做的正确的事情是拥有一个返回 sum 类型的流的 RPC 方法。oneofMyFifthKindOfParticularMessageMyFifthKindOfParticularMessage
| 归档时间: |
|
| 查看次数: |
1930 次 |
| 最近记录: |