gRpc双向流

时间:2018-11-04 21:48:56

标签: grpc grpc-java

比方说,我在服务器上有2个函数加减法。在这种情况下可以使用双向流来增加吞吐量吗?如果是这样,我是否必须为每个请求和响应都具有一个标识符,以区分客户端的响应(例如reqId)?通常,它们将是一元调用,但希望通过流传输来提高吞吐量。

2 个答案:

答案 0 :(得分:0)

的确,流消息比一元RPC具有更低的开销。尽管gRPC团队通常不鼓励仅使用流来提高性能,除非确实需要这样做,否则由于无法将消息分发到多个后端,一个后端上的多个线程,并且消息更加复杂且难以调试。尽管如果您考虑使用一元RPC进行批处理,那么流媒体确实具有您可能更喜欢的优势。

如果服务器按照接收请求的顺序计算响应,则不需要reqId;第一个响应是对第一个请求的响应,第二个响应是对第二个请求的响应,第三响应是对第三个请求的响应,以此类推。gRPC流保留消息顺序。

答案 1 :(得分:0)

使用双向流来提高吞吐量是个坏主意。

对于较低的并发请求,两者的延迟相当。 但是,对于更高的负载,一元调用的性能要好得多。

Streams 确保消息按照发送的顺序进行传递,这意味着如果有并发消息,就会出现某种瓶颈。

没有明显的理由我们应该更喜欢流而不是一元,因为使用流会带来额外的问题,例如:

  • 当我们有并发价格请求时延迟很短
  • 应用层面的复杂实现
  • 缺乏负载平衡:客户端将与一台服务器连接而忽略任何新服务器

这里有一些基准的详细分析:https://nshnt.medium.com/using-grpc-streams-for-unary-calls-cd64a1638c8a