gRPC PHP與GO 資料增長效能測試與分析

CrazyCodes發表於2021-11-07

前言

大家好,我是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

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

結論

Way22020020005000
PHP->gRPC190.551/ms212.332250.104678.6431406.589
Go->gRPC66.215/ms71.52593.963379.699920.897
PHP->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

感謝你看到這裡,希望可以幫到你。

首次釋出此類分析相關文章,可能有很多不足之處,接受各種調教。

相關文章