一得院、面向人群
如果站點架構(gòu)滿足以下幾點梭灿,那么本文的優(yōu)化方案會非常適合:
1)使用php等腳本語言作為開發(fā)語言
2)需要連接后端服務(wù)阴汇,例如RPC服務(wù)、memcache或redis等
3)流量非常大
二尼桶、解決的問題
常見的web架構(gòu)如上:
1)最前端是APP或者web頁面
2)服務(wù)器上層是web-server進行接入
3)php腳本語言調(diào)用后端數(shù)據(jù)操灿,完成業(yè)務(wù)邏輯,拼接頁面
4)最后端是服務(wù)泵督、緩存趾盐、數(shù)據(jù)庫
php是一種腳本語言,不像C++/Java那樣進程能夠常駐,所以它連接后端的服務(wù)都是使用短連接:
上圖是一種典型場景谤碳,站點php部署在機器A上溃卡,緩存memcache部署在機器B上,之間通過短連接通信蜒简,過程為:
1)php建立tcp短連接
2)按照memcache協(xié)議發(fā)送數(shù)據(jù)
3)接收memcache返回的數(shù)據(jù)
4)php關(guān)閉tcp短連接
在站點流量小時瘸羡,上述過程沒有任何問題,當(dāng)站點流量非常大搓茬,QPS很高的情況下犹赖,php對memcache的tcp建立+關(guān)閉tcp短連接的開銷便不能忽略了,有可能成為性能的瓶頸卷仑,如何進行優(yōu)化是本文即將討論的核心峻村。
三、UNIX Domain Socket介紹
話鋒一轉(zhuǎn)锡凝,先一起來看看UNIX Domain Socket技術(shù)粘昨。
UNIX Domain Socket是一種進程間IPC通訊機制,它不需要經(jīng)過網(wǎng)絡(luò)協(xié)議棧窜锯,不需要打包拆包张肾、計算校驗和、維護序號和應(yīng)答等锚扎,只是將應(yīng)用層數(shù)據(jù)從一個進程拷貝到另一個進程吞瞪。它可以用于同一臺主機上兩個沒有親緣關(guān)系的進程,并且是全雙工的驾孔,提供可靠消息傳遞(消息不丟失芍秆、不重復(fù)、不錯亂)的IPC機制翠勉。
四妖啥、優(yōu)化方案
可以看到,UNIX Domain Socket的效率會遠高于tcp短連接眉菱,但它只能用于同一臺主機間的進程通訊迹栓,而php應(yīng)用和后端服務(wù)往往是部署在不同的機器上的,此時能否利用它來進行優(yōu)化呢俭缓,答案是肯定的克伊。
優(yōu)化后的簡易架構(gòu)圖如上,在php應(yīng)用服務(wù)器上部署一個local-proxy华坦,php與local-proxy之間使用UNIX Domain Socket來通訊愿吹,而local-proxy與后端服務(wù)進行TCP長連接通訊,這樣就大大提升了通訊效率惜姐,免除了每次請求都要進行的建立+關(guān)閉tcp短連接的開銷犁跪。
五椿息、local-proxy要點
要實現(xiàn)上述優(yōu)化方案,local-proxy是實現(xiàn)要點坷衍,在實現(xiàn)local-proxy時寝优,有這么幾點需要注意
1)協(xié)議設(shè)計:local-proxy本身沒有任何業(yè)務(wù)邏輯,只負責(zé)請求轉(zhuǎn)發(fā)枫耳,上游發(fā)送過來memcache協(xié)議乏矾,透傳給后端的memcache,這樣的話迁杨,上游客戶端不需要進行任何代碼的修改
2)通訊方式:如上文所述钻心,local-proxy與上游使用UNIX Domain Socket進行通訊,與下游使用tcp長連接進行通信
3)高效框架:這種方案是為了解決tcp短連接的效率損耗铅协,這樣對local-proxy的效率要求就非常高捷沸,可以選用成熟高效的網(wǎng)絡(luò)框架(例如libevent)和tcp長連接連接池技術(shù)來實現(xiàn)
4)請求映射:需要將上游發(fā)過來的請求與發(fā)往下游的請求一一映射起來,這樣才能正確的對應(yīng)上請求包與響應(yīng)包
==【完】==
回【可靠】微信為什么不丟消息狐史?
回【http】http如何像tcp一樣實時的收消息痒给?
回【分區(qū)】互聯(lián)網(wǎng)公司為啥不使用mysql分區(qū)表?
回【過載】如何實施異構(gòu)服務(wù)器的負載均衡及過載保護预皇?
回【接入】lvs為何不能完全替代DNS輪詢
回【均衡】一分鐘了解負載均衡的一切