一个包含一般和特定语言的最佳实践的用户指南,以提高性能。
一般做法
- 尽可能地重复使用存根和通道。
- 使用keepalive pings来保持HTTP/2连接在非活动期的活力,以允许初始RPC快速进行而没有延迟(即C++通道arg GRPC_ARG_KEEPALIVE_TIME_MS)。
- 在处理从客户端到服务器、服务器到客户端或两个方向的长期逻辑数据流时,使用流RPC。流可以避免连续的RPC启动,这包括在客户端的连接负载平衡,在传输层启动新的HTTP/2请求,以及在服务器端调用用户定义的方法处理。
- 然而,流一旦启动就不能进行负载平衡,而且很难对流的故障进行调试。它们也可能在小范围内提高性能,但由于负载平衡和复杂性,会降低可扩展性,所以只有当它们为应用逻辑提供实质性的性能或简单性的好处时,才应该使用。使用流来优化应用程序,而不是gRPC。
题外话:这并不适用于Python(详见Python部分)。
(专题)每个gRPC通道使用0个或更多的HTTP/2连接,每个连接通常对并发的流的数量有限制。当连接上的活动RPC数量达到这个限制时,额外的RPC会在客户端排队,必须等待活动RPC完成后才能发送。具有高负载或长期流式RPC的应用程序可能会因为这种排队而出现性能问题。有两种可能的解决方案。
- 为应用程序中每个高负载的区域创建一个单独的通道。
- 使用一个gRPC通道池将RPC分布在多个连接上(通道必须有不同的通道参数以防止重复使用,所以定义一个特定用途的通道参数,如通道号)。
题外话:gRPC团队已经计划添加一个功能来解决这些性能问题(更多信息见grpc/grpc#21386),所以任何涉及到创建多个通道的解决方案都是临时的解决方法,最终应该不需要。
使用www.DeepL.com/Translator翻译(免费版)
标签:gRPC,性能,实践,最佳,RPC,客户端,连接,通道 From: https://www.cnblogs.com/ben-zhou/p/16742976.html