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 连接的主要内容,如果未能解决你的问题,请参考以下文章

GRPC client阻塞导致无法及时关闭连接的解决方案

GRPC状态码

由于连接被强制终止,使用 ngrok 测试 gRPC 失败

手机grpc通道连接成功啥意思

Node JS:双向 GRPC 调用会打开多个 http2 连接吗?

gRPC 长连接在微服务业务系统中的实践