前言
大家好,我是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
Php Grpc -> Go Grpc 平均響應時間為190.551ms
Php Http -> Go Http 平均響應時間為120.692ms
GPH 20
返回資料集大小一致
gRPC Document Length≈556bytes
Http Document Length≈2198bytes
Go Grpc -> Go Grpc 平均響應時間為71.525ms
Php Grpc -> Go Grpc 平均響應時間為212.019ms
Php Http -> Go Http 平均響應時間為138.332ms
GPH 200
返回資料集大小一致
gRPC Document Length≈5527bytes
Http Document Length≈21199bytes
Go Grpc -> Go Grpc 平均響應時間為93.963ms
Php Grpc -> Go Grpc 平均響應時間為250.104ms
Php Http -> Go Http 平均響應時間為175.916ms
GPH 2000
返回資料集大小一致
gRPC Document Length≈56928bytes
Http Document Length≈213000bytes
Go Grpc -> Go Grpc 平均響應時間為379.699ms
Php Grpc -> Go Grpc 平均響應時間為678.643ms
Php Http -> Go Http 平均響應時間為593.252ms
GPH 5000
返回資料集大小一致
gRPC Document Length≈143928bytes
Http Document Length≈534000bytes
Go Grpc -> Go Grpc 平均響應時間為920.897ms
Php Grpc -> Go Grpc 平均響應時間為1406.589ms
Php Http -> Go Http 平均響應時間為1285.640ms
結論
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方式呼叫效果最佳。
挽尊
你肯定認為,PHP在做微服務上已經被碾壓,但這其實並不是PHP本身的錯誤,我們都知道PHP是解釋型語言,而Go是編譯型語言,Go作為預先編譯後,直接生成可執行檔案,而PHP是動態編譯。
那麼在PHP通過gRPC呼叫為什麼會這麼慢?這取決於我們使用的谷歌官方提供的包,這個包將資料封裝在class內,而class並不像Go的結構體那麼小巧玲瓏,當資料不斷增長後,這個class會指數級擴大,而我們看到PHP通過HTTP呼叫時,雖然內容體是gRPC呼叫的好幾倍,但時間反而變小,這其中的原因也很簡單,通過HTTP呼叫,先要進行通訊,並且封裝HTTP頭,內容體等等,這就造成了請求本體很大,但因為是直接請求一個結果,並沒有通過class,所以時間要低於gRPC呼叫,這是PHP使用gRPC慢的原因之一。
其二就是我們所說的PHP本身的特性,PHP通過動態編譯後向使用者返回結果,這個過程也是需要時間的,而Go則不需要這段時間,所以這也是影響響應時間的關鍵因素。
致謝
感謝你看到這裡,希望可以幫到你。
首次釋出此類分析相關文章,可能有很多不足之處,接受各種調教。