比方说,我在服务器上有2个函数加减法。在这种情况下可以使用双向流来增加吞吐量吗?如果是这样,我是否必须为每个请求和响应都具有一个标识符,以区分客户端的响应(例如reqId)?通常,它们将是一元调用,但希望通过流传输来提高吞吐量。
答案 0 :(得分:0)
的确,流消息比一元RPC具有更低的开销。尽管gRPC团队通常不鼓励仅使用流来提高性能,除非确实需要这样做,否则由于无法将消息分发到多个后端,一个后端上的多个线程,并且消息更加复杂且难以调试。尽管如果您考虑使用一元RPC进行批处理,那么流媒体确实具有您可能更喜欢的优势。
如果服务器按照接收请求的顺序计算响应,则不需要reqId;第一个响应是对第一个请求的响应,第二个响应是对第二个请求的响应,第三响应是对第三个请求的响应,以此类推。gRPC流保留消息顺序。
答案 1 :(得分:0)
使用双向流来提高吞吐量是个坏主意。
对于较低的并发请求,两者的延迟相当。 但是,对于更高的负载,一元调用的性能要好得多。
Streams 确保消息按照发送的顺序进行传递,这意味着如果有并发消息,就会出现某种瓶颈。
没有明显的理由我们应该更喜欢流而不是一元,因为使用流会带来额外的问题,例如:
这里有一些基准的详细分析:https://nshnt.medium.com/using-grpc-streams-for-unary-calls-cd64a1638c8a