大型網(wǎng)站架構(gòu)設(shè)計(jì)是一個(gè)循序漸進(jìn)的過(guò)程,圍繞“性能、可用性、伸縮性、擴(kuò)展性、安全性”展開(kāi),下面是個(gè)人關(guān)于網(wǎng)站架構(gòu)方面的一些總結(jié),不到之處請(qǐng)大家多多批評(píng)。

前端

CDN加速

:css/JS/圖片等靜態(tài)資源使用CDN加速,設(shè)置緩存時(shí)間、Referer限制(防盜鏈)等進(jìn)行流量?jī)?yōu)化;

減少HTTP請(qǐng)求

:將CSS/JS/圖片等靜態(tài)資源合并,可以利用

webpack

等前端構(gòu)建工具進(jìn)行處理

啟用瀏覽器緩存和文件壓縮

:壓縮圖片、JS/CSS混淆壓縮、Web服務(wù)器開(kāi)啟Gzip壓縮&設(shè)置文件expire緩存時(shí)間;

異步加載

:動(dòng)態(tài)接口通過(guò)Ajax異步加載,減少網(wǎng)絡(luò)請(qǐng)求(可以通過(guò)JSONP或者設(shè)置Access-Control-Allow-Origin進(jìn)行跨域);

使用驗(yàn)證碼

:使用短信或圖像驗(yàn)證碼,提高驗(yàn)證碼的復(fù)雜度及多樣性,緩解羊毛黨帶來(lái)的流量沖擊;

減少Cookie傳輸

:Cookie包含在每次請(qǐng)求和響應(yīng)中,太大的Cookie會(huì)嚴(yán)重影響數(shù)據(jù)傳輸,例如針對(duì)CDN采用獨(dú)立域名,可以減少靜態(tài)資源加載攜帶Cookie信息;

緩存

關(guān)于緩存,永遠(yuǎn)要記住

二八定律

:80%的業(yè)務(wù)訪問(wèn)集中在20%的數(shù)據(jù)上。將熱點(diǎn)數(shù)據(jù)進(jìn)行緩存,可以降低網(wǎng)絡(luò)I/O和磁盤(pán)I/O,極大提升響應(yīng)速度,除了前端本地資源緩存外,服務(wù)端緩存常見(jiàn)做法如下:

頁(yè)面靜態(tài)化

:緩存整個(gè)頁(yè)面,或者局部緩存,減少數(shù)據(jù)讀取和運(yùn)算頻率;

數(shù)據(jù)緩存

:充分利用NoSQL數(shù)據(jù)庫(kù),例如memcached、redis、mongodb等,可以部署集群或分布式緩存,提高緩存命中率,減少數(shù)據(jù)訪問(wèn)的壓力,可以進(jìn)行

緩存預(yù)熱

、預(yù)先加載熱點(diǎn)數(shù)據(jù),同時(shí)需要防止

緩存穿透

消息隊(duì)列

異步解耦

:利用Httpsqs、RabbitMQ、Kafka等隊(duì)列或消息中間件,將耗時(shí)/非即時(shí)性操作通過(guò)隊(duì)列進(jìn)行異步處理,提高服務(wù)器響應(yīng)速度,以此降低對(duì)資源的并發(fā)訪問(wèn)。遵循一個(gè)原則:

任何可以晚點(diǎn)做的事情都應(yīng)該晚點(diǎn)再做

削峰填谷

:由于流量是波動(dòng)變化的,高峰和低谷差距很大,可以將一些操作存儲(chǔ)到MQ隊(duì)列中,消費(fèi)端通過(guò)拉取的方式,并且拉去速度有消費(fèi)端來(lái)控制,則就可以控制流量趨于平穩(wěn),達(dá)到了削峰填谷的目的,或者說(shuō)起到了流控的目標(biāo)。

數(shù)據(jù)庫(kù)

使用緩存后,大部分?jǐn)?shù)據(jù)讀取操作都不用通過(guò)數(shù)據(jù)庫(kù)完成,但是在緩存不命中、緩存過(guò)期和全部的寫(xiě)操作時(shí)需要訪問(wèn)數(shù)據(jù)庫(kù)。當(dāng)用戶達(dá)到一定規(guī)模后,數(shù)據(jù)庫(kù)會(huì)因?yàn)樨?fù)載壓力過(guò)高而成為瓶頸,常見(jiàn)做法如下:

讀寫(xiě)分離

:利用MySQL主從復(fù)制機(jī)制搭建讀寫(xiě)分離集群,在客戶端實(shí)現(xiàn)或者服務(wù)端利用中間件(例如MyCAT)實(shí)現(xiàn)讀寫(xiě)分離;

分庫(kù)分表

:針對(duì)不同業(yè)務(wù)類型,進(jìn)行分庫(kù),部署到不同服務(wù)器上,減少單服務(wù)器壓力,同時(shí)針對(duì)大表,根據(jù)一定條件(如用戶ID取模、ID范圍)進(jìn)行水平分表,減少單表讀寫(xiě)壓力;

數(shù)據(jù)庫(kù)連接池

:充分利用連接復(fù)用,解決數(shù)據(jù)庫(kù)連接過(guò)程需要占用資源,影響響應(yīng)速度等問(wèn)題,php本身沒(méi)有連接池,可以利用第三方框架實(shí)現(xiàn)(例如SMProxy);

硬件優(yōu)化

:利用磁盤(pán)陣列(RAID)提升數(shù)據(jù)可靠性,資金充足的話可以換SSD硬盤(pán);

負(fù)載均衡

業(yè)務(wù)拆分

:根據(jù)URL拆分業(yè)務(wù),分發(fā)流量到不同的服務(wù)器組,防止單一功能模塊卡住,而影響整個(gè)業(yè)務(wù),主要遵循SOA的架構(gòu)思路,將業(yè)務(wù)模塊打散(雞蛋不要放在一個(gè)籃子里面)

反向代理負(fù)載均衡

:充分利用Nginx/Haproxy/LVS反向代理負(fù)載均衡,搭建服務(wù)器集群,提升并發(fā)處理能力;

DNS負(fù)載均衡

:DNS解析可以依據(jù)不同網(wǎng)絡(luò)運(yùn)營(yíng)商、地區(qū)進(jìn)行分別解析、從而實(shí)現(xiàn)DNS層面負(fù)載均衡;

代碼

多線程

:充分利用多CPU優(yōu)勢(shì)進(jìn)行數(shù)據(jù)批處理

:在高并發(fā)情況下,對(duì)統(tǒng)一資源讀寫(xiě)訪問(wèn)容易出現(xiàn)臟讀、幻讀,這個(gè)時(shí)候需要對(duì)核心資源枷鎖,利用Redis或者Zookeeper等可以實(shí)現(xiàn)分布式鎖;

設(shè)計(jì)模式

:充分利用設(shè)計(jì)模式,實(shí)現(xiàn)邏輯解耦、分層和資源服用,例如單利模式、觀察者模式等;

數(shù)據(jù)結(jié)構(gòu)和算法

:好的數(shù)據(jù)結(jié)構(gòu)和算法可以給程序性能帶來(lái)很大提升、例如鏈表查找、快速排序等;

垃圾回收

:良好的編程習(xí)慣,例如即時(shí)清理內(nèi)存占用大的變量、避免操作的數(shù)據(jù)量大等都可以避免出現(xiàn)內(nèi)存泄漏(OOM)的情況發(fā)生。

SQL查詢優(yōu)化

:SQL執(zhí)行效率一般是影響響應(yīng)速度的關(guān)鍵,可以開(kāi)啟SQL慢查詢?nèi)罩?,?duì)執(zhí)行效率慢的SQL語(yǔ)句進(jìn)行優(yōu)化;

GIT多分支

:良好的分支管理對(duì)于CI/CD、版本測(cè)試有很好的作用,建議參考git-flow進(jìn)行日常Git協(xié)作。

日志

:統(tǒng)一的日志輸出標(biāo)準(zhǔn),有利于進(jìn)行數(shù)據(jù)追蹤和問(wèn)題排查。

冗余

數(shù)據(jù)定期備份

:定期全量備份+主從同步增量備份,例如MySQL/Redis主從復(fù)制進(jìn)行增量備份、Mysqldump全量備份、Redis利用RDB或者AOF進(jìn)行備份;

集群

:一定數(shù)量的備用服務(wù)器,可以保障系統(tǒng)的高可用,防止單點(diǎn)故障,可以結(jié)合Keepalived+LVS/HAProxy/Nginx等實(shí)現(xiàn)數(shù)據(jù)庫(kù)/Web服務(wù)器/緩存/消息中間件高可用集群;

自動(dòng)化

CI/CD

:利用成熟的CI/CD機(jī)制實(shí)現(xiàn)自動(dòng)化測(cè)試、代碼檢測(cè),自動(dòng)化發(fā)布,例如可采用Git+Jenkins+Docker搭建CI/CD工作流。

自動(dòng)化部署

:針對(duì)超過(guò)30臺(tái)的服務(wù)器部署,可以采用

ansible

進(jìn)行批量管理

自動(dòng)監(jiān)控/報(bào)警

:監(jiān)控用戶行為日志、服務(wù)器日志等 ,可結(jié)合

zabbix+ELK

進(jìn)行實(shí)施;

自動(dòng)降級(jí)和資源調(diào)度

:微服務(wù)架構(gòu)范疇,作者也在努力學(xué)習(xí)中。

安全

二次驗(yàn)證

:充分手機(jī)驗(yàn)證/人臉識(shí)別進(jìn)行二次驗(yàn)證,保障操作的真實(shí)性;

web防火墻

:傳統(tǒng)防火墻僅限于包過(guò)濾,網(wǎng)絡(luò)和端口地址轉(zhuǎn)換(NAT)和VPN等功能。它根據(jù)端口,協(xié)議和IP地址做出決策;Web防火墻(WAF)則提供了HTTP/HTTPS訪問(wèn)請(qǐng)求監(jiān)控、自定義過(guò)濾規(guī)則、Web攻擊防護(hù)、安全合規(guī)等功能;可以利用阿里云等提供的WAF服務(wù)或者基于Nginx+lua等實(shí)現(xiàn)的類似API網(wǎng)關(guān)實(shí)施類似功能;

內(nèi)外網(wǎng)隔斷

:暴露出來(lái)的IP和端口越少,安全系數(shù)越高;例如數(shù)據(jù)庫(kù)服務(wù)、緩存服務(wù)、中間件等盡量只允許內(nèi)外訪問(wèn),如果確實(shí)需要可以通過(guò)路由轉(zhuǎn)發(fā)或反向代理實(shí)現(xiàn);

數(shù)據(jù)加密

:充分利用非對(duì)稱加密,例如啟用https, rsa加密等,保障數(shù)據(jù)傳輸?shù)陌踩裕?p>網(wǎng)絡(luò)攻擊

:需要防止DDoS攻擊、XSS攻擊、SQL注入、CSRF等,常見(jiàn)手段CDN加速、高仿IP、linux內(nèi)核優(yōu)化、數(shù)據(jù)輸入輸出過(guò)濾、Referer限制、表單添加隨機(jī)token/驗(yàn)證碼等;

信息安全

:對(duì)于垃圾信息、敏感信息可以采用第三方解決方案(例如網(wǎng)易云盾、百度AI等)對(duì)文本、圖片、音頻、視頻等進(jìn)行過(guò)濾和審核。

1.《大型網(wǎng)站 大型網(wǎng)站架構(gòu)設(shè)計(jì)與方法總結(jié)》援引自互聯(lián)網(wǎng),旨在傳遞更多網(wǎng)絡(luò)信息知識(shí),僅代表作者本人觀點(diǎn),與本網(wǎng)站無(wú)關(guān),侵刪請(qǐng)聯(lián)系頁(yè)腳下方聯(lián)系方式。

2.《大型網(wǎng)站 大型網(wǎng)站架構(gòu)設(shè)計(jì)與方法總結(jié)》僅供讀者參考,本網(wǎng)站未對(duì)該內(nèi)容進(jìn)行證實(shí),對(duì)其原創(chuàng)性、真實(shí)性、完整性、及時(shí)性不作任何保證。

3.文章轉(zhuǎn)載時(shí)請(qǐng)保留本站內(nèi)容來(lái)源地址,http://f99ss.com/keji/346809.html