性能最佳实践


一个包含一般和特定语言的最佳实践的用户指南,以提高性能。

一般做法

  • 尽可能地重复使用存根和通道。
  • 使用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的应用程序可能会因为这种排队而出现性能问题。有两种可能的解决方案。

  1. 为应用程序中每个高负载的区域创建一个单独的通道。
  2. 使用一个gRPC通道池将RPC分布在多个连接上(通道必须有不同的通道参数以防止重复使用,所以定义一个特定用途的通道参数,如通道号)。

题外话:gRPC团队已经计划添加一个功能来解决这些性能问题(更多信息见grpc/grpc#21386),所以任何涉及到创建多个通道的解决方案都是临时的解决方法,最终应该不需要。

使用www.DeepL.com/Translator翻译(免费版)

posted @ 2022-09-29 20:28  风在何方  阅读(51)  评论(0编辑  收藏  举报