一般來(lái)說(shuō),解決WEB高并發(fā)的有效手段都是采用可線性擴(kuò)展的多層分布式架構(gòu):。
Webserver (Nginx):這一層是可以輕松分布式部署的,結(jié)合智能DNS解析可以簡(jiǎn)易地防止單點(diǎn)故障、實(shí)現(xiàn)區(qū)域訪問(wèn)加速,結(jié)合LVS很容易實(shí)現(xiàn)負(fù)載均衡。這一層主要是負(fù)責(zé)處理靜態(tài)請(qǐng)求和轉(zhuǎn)發(fā)PHP請(qǐng)求至第二層的PHP處理節(jié)點(diǎn),至于靜態(tài)資源地址 (http://misc.xxxx.com )可以單獨(dú)拿出來(lái)部署,或者直接使用商用的云存儲(chǔ)服務(wù)(國(guó)內(nèi)七牛不錯(cuò),國(guó)外有Amazon S3)
PHP處理節(jié)點(diǎn):一個(gè)節(jié)點(diǎn)其實(shí)就是一個(gè)監(jiān)聽(tīng)特定端口的系統(tǒng)進(jìn)程,webserver的請(qǐng)求通過(guò)負(fù)載均衡器(我用的AWS的loadbalancer)進(jìn)行分發(fā),很好實(shí)現(xiàn)分布式和負(fù)載均衡。我現(xiàn)在用的還是php自帶的php-fpm,其實(shí)facebook出的hhvm性能非常強(qiáng)悍,但是還不能100%通過(guò)我項(xiàng)目的單元測(cè)試,等hhvm成熟過(guò)后可以平滑替換。
高速緩存:用的memcached,這一層的作用主要是減輕數(shù)據(jù)庫(kù)IO和加快熱數(shù)據(jù)訪問(wèn),緩存策略與程序耦合度較高,不贅述,但簡(jiǎn)單地說(shuō)有兩種方式,一種是在程序的全局層面加一個(gè)緩存處理,這種方法代碼耦合度低,但是有效命中率不高,有些項(xiàng)目不一定適應(yīng),另一種是在具體的數(shù)據(jù)存取處加緩存處理,這種辦法程序耦合度較高,但是緩存命中率非常高,幾乎沒(méi)有無(wú)效緩存存在,我用的是這種。
數(shù)據(jù)庫(kù): 我現(xiàn)在的項(xiàng)目數(shù)據(jù)規(guī)模不大,暫時(shí)只用了單臺(tái)數(shù)據(jù)庫(kù),但是程序邏輯上已做好了數(shù)據(jù)庫(kù)線性擴(kuò)展的準(zhǔn)備。其實(shí)數(shù)據(jù)庫(kù)層的擴(kuò)展是老生常談了,常用手段是分庫(kù)分表,這一塊需要在前期的代碼就打下基礎(chǔ),另外更平滑地手段是使用中間件,比如360的Atlas,阿里巴巴的cobar,淘寶的TDDL,中間件可以在不大范圍變更代碼的情況下擴(kuò)展,但是具體的使用場(chǎng)景還是有限的,具體項(xiàng)目還需單獨(dú)考察。
其他:根據(jù)不同的項(xiàng)目,架構(gòu)還可以選擇性地使用隊(duì)列,我現(xiàn)在用的beantalkd,Redis也是一個(gè)很好的選擇。隊(duì)列常用的使用環(huán)境是郵件發(fā)送和站內(nèi)消息推送上面,但是在某些場(chǎng)景下也可以作為核心數(shù)據(jù)庫(kù)的緩沖,對(duì)應(yīng)對(duì)大并發(fā)或者突發(fā)性流量也是不錯(cuò)的選擇。
一層層剝開(kāi)來(lái)講,有以下部位需要注意。
1.資源:能靜態(tài)實(shí)現(xiàn)的就靜態(tài)實(shí)現(xiàn),靜態(tài)資源也要盡量使用分布式存儲(chǔ),例如云存儲(chǔ)。
2.效率:PHP代碼里,盡量注意內(nèi)存的使用,單個(gè)腳本的運(yùn)行效率要Ok.
3.緩存:使用memcache來(lái)實(shí)現(xiàn)非持久存儲(chǔ),使用no-sql來(lái)實(shí)現(xiàn)持久存儲(chǔ)。
4.server:使用nginx+fpm或者nginx+apache,來(lái)實(shí)現(xiàn)動(dòng)靜態(tài)分離訪問(wèn)。
5.mysql:作為最終的存儲(chǔ)庫(kù)以及一些不可避免的實(shí)時(shí)調(diào)用庫(kù),做主從處理,Master+多Slave,多個(gè)只讀副本來(lái)實(shí)現(xiàn)實(shí)時(shí)的調(diào)用庫(kù)。
6.負(fù)載:建議架設(shè)一層負(fù)載均衡,來(lái)實(shí)現(xiàn)web server的輪詢。例如云平臺(tái)中的LBS。
前端資源cdn處理
應(yīng)用集群部署
大的應(yīng)用拆分為小的應(yīng)用
應(yīng)用緩存redis等
搜索引擎使用solr等
數(shù)據(jù)庫(kù)分庫(kù)分表