5

gRPC PHP与GO 数据增长性能测试与分析

 2 years ago
source link: https://segmentfault.com/a/1190000040922184
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

大家好,我是CrazyCodes,最近调研了下关于PHP通过gRPC请求go,与PHP通过HTTP方式请求,根据数据量不断增长的情况下,平均响应时间会有多大差距。

一致性声明

测试报告全部由开发机测试得出,未进行任何配置更改。

本机配置

  • 3 GHz 六核Intel Core i5
  • 16 GB 2400 MHz DDR4
  • MacOs

Go启动HTTP

http.ListenAndServe

PHP启动HTTP

php -S 127.0.0.1:8088

Ab

ab -c 200 -n 200 -k

测试数据说明
Go作为服务端,是通过for直接迭代出的测试数据,没有任何其他多余操作

// 伪代码
for i := 0; i < 2,20,200,2000,5000; i++ {

}

其他说明

下方GPH[数字],代表gRPC + PHP + HTTP + 数据量

返回数据集大小一致

gRPC Document Length≈87bytes
Http Document Length≈315bytes

Go Grpc -> Go Grpc 平均响应时间为66.215ms

go-2.png

Php Grpc -> Go Grpc 平均响应时间为190.551ms

php-2.png

Php Http -> Go Http 平均响应时间为120.692ms

php-http-2.png

GPH 20

返回数据集大小一致

gRPC Document Length≈556bytes
Http Document Length≈2198bytes

Go Grpc -> Go Grpc 平均响应时间为71.525ms

go-20.png

Php Grpc -> Go Grpc 平均响应时间为212.019ms

php-20.png

Php Http -> Go Http 平均响应时间为138.332ms

php-http-20.png

GPH 200

返回数据集大小一致

gRPC Document Length≈5527bytes
Http Document Length≈21199bytes

Go Grpc -> Go Grpc 平均响应时间为93.963ms

go-200.png

Php Grpc -> Go Grpc 平均响应时间为250.104ms

php-200.png

Php Http -> Go Http 平均响应时间为175.916ms

php-http-200.png

GPH 2000

返回数据集大小一致

gRPC Document Length≈56928bytes
Http Document Length≈213000bytes

Go Grpc -> Go Grpc 平均响应时间为379.699ms

go-2000.png

Php Grpc -> Go Grpc 平均响应时间为678.643ms

php-2000.png

Php Http -> Go Http 平均响应时间为593.252ms

php-http-2000.png

GPH 5000

返回数据集大小一致

gRPC Document Length≈143928bytes
Http Document Length≈534000bytes

Go Grpc -> Go Grpc 平均响应时间为920.897ms

go-5000.png

Php Grpc -> Go Grpc 平均响应时间为1406.589ms

php-5000.png

Php Http -> Go Http 平均响应时间为1285.640ms

php-http-5000.png

Way22020020005000PHP->gRPC190.551/ms212.332250.104678.6431406.589Go->gRPC66.215/ms71.52593.963379.699920.897PHP->Http120.692/ms138.332175.916593.2521285.640

根据测试结果,我们不难看出,再构建微服务时,PHP以gRPC的方式请求是最不理想的情况,而PHP以Http方式调用在响应时间来看,要比PHP以gRPC调用的方式稍微理想一些,但数据与并发不断增长的情况下,这个差距会不断变大,所以在决定使用PHP作为客户端时,还是以传统HTTP方式调用效果最佳。

image.png

你肯定认为,PHP在做微服务上已经被碾压,但这其实并不是PHP本身的错误,我们都知道PHP是解释型语言,而Go是编译型语言,Go作为预先编译后,直接生成可执行文件,而PHP是动态编译。

那么在PHP通过gRPC调用为什么会这么慢?这取决于我们使用的谷歌官方提供的包,这个包将数据封装在class内,而class并不像Go的结构体那么小巧玲珑,当数据不断增长后,这个class会指数级扩大,而我们看到PHP通过HTTP调用时,虽然内容体是gRPC调用的好几倍,但时间反而变小,这其中的原因也很简单,通过HTTP调用,先要进行通信,并且封装HTTP头,内容体等等,这就造成了请求本体很大,但因为是直接请求一个结果,并没有通过class,所以时间要低于gRPC调用,这是PHP使用gRPC慢的原因之一。

其二就是我们所说的PHP本身的特性,PHP通过动态编译后向用户返回结果,这个过程也是需要时间的,而Go则不需要这段时间,所以这也是影响响应时间的关键因素。

image.png

感谢你看到这里,希望可以帮到你。

首次发布此类分析相关文章,可能有很多不足之处,接受各种调教。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK