php gRPC 连接
Posted
技术标签:
【中文标题】php gRPC 连接【英文标题】:php gRPC connections 【发布时间】:2020-05-24 07:04:36 【问题描述】:我有一个问题,我似乎找不到答案。 我们正在用 Go 构建一个 gRPC 微服务,以服务于我们用 php 编写的主要应用程序。我现在正在对其中一个函数进行一些测试,以查看性能。
我的结果表明,建立连接大约需要 2 秒,但之后,每次调用不到 1 微秒。
它在实际应用中是如何工作的?它是打开一个保持活动状态一段时间的共享连接,还是对我们的应用程序的每个请求都必须打开它自己与服务的连接?
如果每个请求都必须打开自己的连接,是否有可能绕过这个以摆脱建立新连接所带来的开销?
【问题讨论】:
用php写了一个,对它的复杂性很失望,第一次连接总是很慢。 php 旨在以这种方式工作,而在其他非阻塞语言中可以在请求结束后运行,因此 php 将始终在每个新请求时重置 看了一下gRPC,它似乎是通过流式传输完成的,这意味着您可以快速获得开始流式传输的结果,但这并不意味着它是流式传输所有数据的最终结果通过这。与流一样,它取决于流传输的数据量,因此如果它很小并且可以在初始数据包大小内传输 - 那么肯定会很快。数据量越大 - 传输、最终聚合、处理等所需的时间就越长。 【参考方案1】:你需要的是所谓的连接池。
我在 Google 上短暂搜索后发现了这个 PR https://github.com/grpc/grpc/issues/15426,但我不确定它是否真的用于池连接。
如果您能够创建连接民意调查,您可以选择一个可用的连接并用于您的请求。
[编辑]
我刚刚找到了一些可能满足您需求的东西:
https://github.com/swoole/swoole-src#the-simplest-example-of-a-connection-pool
如果你按照 Redis 连接池的例子,你将能够创建一个 gRPC 连接池。
【讨论】:
【参考方案2】:最新的 php-grpc 扩展将保留您的连接并在请求之间重新使用它们。 这些被称为“持久”连接。如果提供给连接构造函数的参数集完全相同,则可以重用先前的连接。
来源:php-grpc 文档:https://grpc.github.io/grpc/php/class_grpc_1_1_channel.html
默认情况下,底层 grpc_channel 是“持久的”。也就是说,给定传递给构造函数的相同参数集,将返回相同的底层 grpc_channel。
【讨论】:
以上是关于php gRPC 连接的主要内容,如果未能解决你的问题,请参考以下文章