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

前言

大家好,我是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 + 数据量

GPH 2

返回数据集大小一致

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

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

gRPC PHP与GO 数据增长性能测试与分析_第1张图片

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

gRPC PHP与GO 数据增长性能测试与分析_第2张图片

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

gRPC PHP与GO 数据增长性能测试与分析_第3张图片

GPH 20

返回数据集大小一致

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

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

gRPC PHP与GO 数据增长性能测试与分析_第4张图片

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

gRPC PHP与GO 数据增长性能测试与分析_第5张图片

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

gRPC PHP与GO 数据增长性能测试与分析_第6张图片

GPH 200

返回数据集大小一致

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

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

gRPC PHP与GO 数据增长性能测试与分析_第7张图片

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

gRPC PHP与GO 数据增长性能测试与分析_第8张图片

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

gRPC PHP与GO 数据增长性能测试与分析_第9张图片

GPH 2000

返回数据集大小一致

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

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

gRPC PHP与GO 数据增长性能测试与分析_第10张图片

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

gRPC PHP与GO 数据增长性能测试与分析_第11张图片

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

gRPC PHP与GO 数据增长性能测试与分析_第12张图片

GPH 5000

返回数据集大小一致

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

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

gRPC PHP与GO 数据增长性能测试与分析_第13张图片

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

gRPC PHP与GO 数据增长性能测试与分析_第14张图片

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

gRPC PHP与GO 数据增长性能测试与分析_第15张图片

结论

Way 2 20 200 2000 5000
PHP->gRPC 190.551/ms 212.332 250.104 678.643 1406.589
Go->gRPC 66.215/ms 71.525 93.963 379.699 920.897
PHP->Http 120.692/ms 138.332 175.916 593.252 1285.640

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

挽尊

gRPC PHP与GO 数据增长性能测试与分析_第16张图片

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

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

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

致谢

gRPC PHP与GO 数据增长性能测试与分析_第17张图片

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

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

你可能感兴趣的:(grpcphpgolangab)