新聞中心
一、面向人群

在新鄉(xiāng)等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎng)前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供成都做網(wǎng)站、成都網(wǎng)站制作 網(wǎng)站設(shè)計(jì)制作按需求定制開發(fā),公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),品牌網(wǎng)站建設(shè),營(yíng)銷型網(wǎng)站建設(shè),成都外貿(mào)網(wǎng)站制作,新鄉(xiāng)網(wǎng)站建設(shè)費(fèi)用合理。
如果站點(diǎn)架構(gòu)滿足以下幾點(diǎn),那么本文的優(yōu)化方案會(huì)非常適合:
1)使用php等腳本語(yǔ)言作為開發(fā)語(yǔ)言
2)需要連接后端服務(wù),例如RPC服務(wù)、memcache或redis等
3)流量非常大
二、解決的問(wèn)題
常見的web架構(gòu)如上:
1)最前端是APP或者web頁(yè)面
2)服務(wù)器上層是web-server進(jìn)行接入
3)php腳本語(yǔ)言調(diào)用后端數(shù)據(jù),完成業(yè)務(wù)邏輯,拼接頁(yè)面
4)***端是服務(wù)、緩存、數(shù)據(jù)庫(kù)
php是一種腳本語(yǔ)言,不像C++/Java那樣進(jìn)程能夠常駐,所以它連接后端的服務(wù)都是使用短連接:
上圖是一種典型場(chǎng)景,站點(diǎn)php部署在機(jī)器A上,緩存memcache部署在機(jī)器B上,之間通過(guò)短連接通信,過(guò)程為:
1)php建立tcp短連接
2)按照memcache協(xié)議發(fā)送數(shù)據(jù)
3)接收memcache返回的數(shù)據(jù)
4)php關(guān)閉tcp短連接
在站點(diǎn)流量小時(shí),上述過(guò)程沒(méi)有任何問(wèn)題,當(dāng)站點(diǎn)流量非常大,QPS很高的情況下,php對(duì)memcache的tcp建立+關(guān)閉tcp短連接的開銷便不能忽略了,有可能成為性能的瓶頸,如何進(jìn)行優(yōu)化是本文即將討論的核心。
三、UNIX Domain Socket介紹
話鋒一轉(zhuǎn),先一起來(lái)看看UNIX Domain Socket技術(shù)。
UNIX Domain Socket是一種進(jìn)程間IPC通訊機(jī)制,它不需要經(jīng)過(guò)網(wǎng)絡(luò)協(xié)議棧,不需要打包拆包、計(jì)算校驗(yàn)和、維護(hù)序號(hào)和應(yīng)答等,只是將應(yīng)用層數(shù)據(jù)從一個(gè)進(jìn)程拷貝到另一個(gè)進(jìn)程。它可以用于同一臺(tái)主機(jī)上兩個(gè)沒(méi)有親緣關(guān)系的進(jìn)程,并且是全雙工的,提供可靠消息傳遞(消息不丟失、不重復(fù)、不錯(cuò)亂)的IPC機(jī)制。
四、優(yōu)化方案
可以看到,UNIX Domain Socket的效率會(huì)遠(yuǎn)高于tcp短連接,但它只能用于同一臺(tái)主機(jī)間的進(jìn)程通訊,而php應(yīng)用和后端服務(wù)往往是部署在不同的機(jī)器上的,此時(shí)能否利用它來(lái)進(jìn)行優(yōu)化呢,答案是肯定的。
優(yōu)化后的簡(jiǎn)易架構(gòu)圖如上,在php應(yīng)用服務(wù)器上部署一個(gè)local-proxy,php與local-proxy之間使用UNIX Domain Socket來(lái)通訊,而local-proxy與后端服務(wù)進(jìn)行TCP長(zhǎng)連接通訊,這樣就大大提升了通訊效率,免除了每次請(qǐng)求都要進(jìn)行的建立+關(guān)閉tcp短連接的開銷。
五、local-proxy要點(diǎn)
要實(shí)現(xiàn)上述優(yōu)化方案,local-proxy是實(shí)現(xiàn)要點(diǎn),在實(shí)現(xiàn)local-proxy時(shí),有這么幾點(diǎn)需要注意
1)協(xié)議設(shè)計(jì):local-proxy本身沒(méi)有任何業(yè)務(wù)邏輯,只負(fù)責(zé)請(qǐng)求轉(zhuǎn)發(fā),上游發(fā)送過(guò)來(lái)memcache協(xié)議,透?jìng)鹘o后端的memcache,這樣的話,上游客戶端不需要進(jìn)行任何代碼的修改
2)通訊方式:如上文所述,local-proxy與上游使用UNIX Domain Socket進(jìn)行通訊,與下游使用tcp長(zhǎng)連接進(jìn)行通信
3)高效框架:這種方案是為了解決tcp短連接的效率損耗,這樣對(duì)local-proxy的效率要求就非常高,可以選用成熟高效的網(wǎng)絡(luò)框架(例如libevent)和tcp長(zhǎng)連接連接池技術(shù)來(lái)實(shí)現(xiàn)
4)請(qǐng)求映射:需要將上游發(fā)過(guò)來(lái)的請(qǐng)求與發(fā)往下游的請(qǐng)求一一映射起來(lái),這樣才能正確的對(duì)應(yīng)上請(qǐng)求包與響應(yīng)包
文章轉(zhuǎn)載自微信公眾號(hào)“架構(gòu)師之路”
網(wǎng)頁(yè)標(biāo)題:php使用tcp長(zhǎng)連接的一種優(yōu)化思路
當(dāng)前路徑:http://fisionsoft.com.cn/article/dpddieo.html


咨詢
建站咨詢
