【发布时间】: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 实现——我不会先验地期望一个对于任意硬件和网络设置,通常比另一个更好。多个连接有更多的预热开销,但如果您“[发出]大量请求”,那么这可以忽略不计,所以从最简单的、基准测试和迭代开始。
标签: python grpc connection-pooling