【发布时间】:2020-10-17 00:51:34
【问题描述】:
背景:
我们正在尝试将 API 网关从 REST 迁移到 gRPC。 API 网关将由后端团队使用 REST 进行消费,并且从 API 网关到微服务的通信将使用 gRPC。我们的 API Gateway 使用 Tornado Python 框架、Gunicorn 构建,并使用 tornado.curl_httpclient.CurlAsyncHTTPClient 为每个端点启用 Async / Future。每个端点都将使用 Unary RPC 调用微服务,并且 gRPC 存根将返回 Future。
因此,在完全迁移到 gRPC 之前,我们会尝试比较 gRPC 与 REST 的性能。以下是您可能需要了解的详细信息:
- 我们有 3 个端点要测试。
/0、/1和/2带有单个字符串有效负载。有效负载大小为 100KB、1MB 和 4MB。这些消息在实例刚启动时已经创建,因此端点只需要检索它。 - 每个端点的并发数 = 1、4、10。
- gRPC 线程池最大工作线程数 = 1,Gunicorn 的工作线程数 = 16。
- 我们正在使用 APIB 进行负载测试。
- 所有负载测试均使用 GCP VM 实例完成。机器规格是: Intel Broadwell,n1-standard-1(1 个 vCPU,3.75 GB 内存),操作系统:Debian 9
- 代码结构相似,业务逻辑相同。
结论是并发和有效负载大小越高,gRPC 变得越慢,最终比 REST 慢。
问题:
- 与 REST 相比,gRPC 是否无法通过使用一元调用来处理大负载大小和大并发?
- 有没有办法让 gRPC 变得比 REST 更快?
- 有什么我错过的根本原因吗?
以下是我尝试过的几种方法:
- 来自 grpcio 的 GZIP 压缩。结果是它变得比以前慢了。
- 在存根和服务器配置上使用
GRPC_ARG_KEEPALIVE_PERMIT_WITHOUT_CALLS和GRPC_ARG_KEEPALIVE_TIMEOUT_MS选项。性能没有变化。 - 将 gRPC 服务器最大工作人员更改为
10000。结果:性能没有变化。 - 将 Gunicorn Worker 更改为
1。结果:性能没有变化。
我没试过的方式:
- 使用流 RPC
任何帮助都会显示出来。谢谢。
【问题讨论】:
标签: performance tornado gunicorn grpc grpc-python