grpc 客户端 python:如何创建 grpc 客户端连接池以获得更好的吞吐量?

Posted

技术标签:

【中文标题】grpc 客户端 python:如何创建 grpc 客户端连接池以获得更好的吞吐量?【英文标题】:grpc client python: How to create grpc client connection pool for better throughput? 【发布时间】:2020-08-13 22:58:09 【问题描述】:

我们的用例是发出大量请求。每个请求返回 1 MB 的数据。现在,在客户端,我们创建一个 GRPC 通道并循环运行以下函数

content_grpc_channel = grpc.insecure_channel(content_netloc)
test_stub = test_pb2_grpc.ContentServiceInternalStub(
    content_grpc_channel)

def get_feature_data_future(feature_id, span_context=()):
  req_feature = test_pb2.GetFeatureRequest()
  req_feature.feature_id = feature_id
  resp_feature_future = test_stub.GetFeature.future(
      req_feature, metadata=span_context)
  return resp_feature_future

我的问题是在 python 中如何创建 grpc 客户端连接池以获得更好的吞吐量?

在 golang 中我看到了这个 https://godoc.org/google.golang.org/api/option#WithGRPCConnectionPool,但我很难在 python 中找到文档。

python中是否有这样的实用程序来创建grpc连接池?或者我应该创建多个 grpc 频道并自己管理这些频道?我假设每个通道都有不同的 tcp 连接,对吗?

【问题讨论】:

不是一个完整的答案,但是 grpc 使用 http/2 并且可以在单个 tcp 连接上轻松处理多个通道。 @HansMusgrave 明白了。您是说使用多个 TCP 连接(每个连接还跨多个服务器进行负载平衡)不会产生比单个连接更好的吞吐量吗? 他们可能会也可能不会。根据配置细节和使用模式,网络性能可能会有很大差异。不过,作为一个粗略的启发式方法,所有数据都通过两端的单个 NIC,并且通道多路复用开销必须发生在某个地方,无论是 tcp 堆栈还是 http/2 实现——我不会先验地期望一个对于任意硬件和网络设置,通常比另一个更好。多个连接有更多的预热开销,但如果您“[发出]大量请求”,那么这可以忽略不计,所以从最简单的、基准测试和迭代开始。 【参考方案1】:

gRPC 使用 HTTP/2,可以在一个连接上多路复用多个请求,并且 gRPC 客户端连接应在客户端应用程序的整个生命周期内重复使用。

您提到的 Golang 链接说 WithGRPCConnectionPool 将用于平衡请求。如果需要,您可能会搜索负载平衡,但请记住,负载平衡仅在您有多个 gRPC 服务器实例时才有意义。

如果您正在寻找一个受数据库操作启发的连接池,我想说您不必担心它,因为使用 gRPC 时不存在打开连接开销

【讨论】:

以上是关于grpc 客户端 python:如何创建 grpc 客户端连接池以获得更好的吞吐量?的主要内容,如果未能解决你的问题,请参考以下文章

如何创建符合 GRPC 的 OkHttpClient?

如何使gRPC 获得最佳性能?

如何使用 python 客户端调用 knative 服务 [grpc 服务器]

如果 grpc-python 服务器端有类实例,如何让每个客户端获取它们的状态?

Python gRPC 入门

gRPC