php使用tcp長連接的一種最佳化思路

高洛峰
發布: 2016-10-13 14:53:48
原創
1666 人瀏覽過

一、面向人群

如果站點架構滿足以下幾點,那麼本文的優化方案會非常適合:

1)使用php等腳本語言作為開發語言

2)需要連接後端服務,例如RPC服務、 memcache或redis等

3)流量非常大

二、解決的問題

php使用tcp長連接的一種最佳化思路

常見的web架構如上:

1)最前端是APP或web頁面

-server進行存取

3)php腳本語言呼叫後端數據,完成業務邏輯,拼接頁面

4)最後端是服務、快取、資料庫

php是一種腳本語言,不像C++/Java那樣進程能夠常駐,所以它連接後端的服務都是使用短連接:

php使用tcp長連接的一種最佳化思路

上圖是一種典型場景,站點php部署在機器A上,緩存memcache部署在機器B上,之間通過短連接通信,流程為:

1)php建立tcp短連線

2)依照memcache協定傳送資料

3)接收memcache回傳的資料

4)php關閉tcp短連線

任何問題,當站點流量非常大,QPS很高的情況下,php對memcache的tcp建立+關閉tcp短連接的開銷便不能忽略了,有可能成為性能的瓶頸,如何進行優化是本文即將討論的核心。

三、UNIX Domain Socket介紹

話鋒一轉,先一起來看看UNIX Domain Socket技術。

UNIX Domain Socket是一種進程間IPC通訊機制,它不需要經過網路協定棧,不需要打包拆包、計算校驗和、維護序號和應答等,只是將應用層資料從一個進程拷貝到另一個進程。它可以用於同一台主機上兩個沒有親緣關係的進程,並且是全雙工的,提供可靠消息傳遞(消息不丟失、不重複、不錯亂)的IPC機制。

四、最佳化方案

可以看到,UNIX Domain Socket的效率會遠高於tcp短連接,但它只能用於同一台主機間的進程通訊,而php應用和後端服務往往是部署在不同的機器上的,此時能否利用它來進行最佳化呢,答案是肯定的。

php使用tcp長連接的一種最佳化思路

化後的簡易架構圖如上,在php應用伺服器上部署一個local-proxy,php與local-proxy之間使用UNIX Domain Socket來通訊,而local-proxy與後端服務進行TCP長連線通訊,這樣就大大提升了通訊效率,免除了每次請求都要進行的建立+關閉tcp短連接的開銷。

五、local-proxy要點

要實現上述優化方案,local-proxy是實現要點,在實現local-proxy時,有這麼幾點需要注意

1)協議設計:local-proxy本身沒有任何業務邏輯,只負責請求轉發,上游發送過來memcache協議,透傳給後端的memcache,這樣的話,上游客戶端不需要進行任何代碼的修改

2)通訊方式:如上文所述,local-proxy與上游使用UNIX Domain Socket進行通訊,與下游使用tcp長連接進行通訊

3)高效框架:這種方案是為了解決tcp短連接的效率損耗,這樣對local-proxy的效率要求就非常高,可以選用成熟高效的網路框架(例如libevent)和tcp長連接連接池技術來實作

4)請求映射:需要將上游發過來的請求與發往下游的請求一一映射起來,這樣才能正確的對應上請求包與響應包


來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門推薦
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!