當(dāng)我們討論互聯(lián)網(wǎng)產(chǎn)品高性能架構(gòu)的時(shí)候拍冠,往往聚焦在高性能的后端服務(wù)贴妻。其實(shí)用戶是通過客戶端前端來直接體驗(yàn)互聯(lián)網(wǎng)產(chǎn)品的涧团,前端高性能設(shè)計(jì)也是很重要的只磷。用戶使用互聯(lián)網(wǎng)產(chǎn)品的基本流程如下圖。用戶使用電腦Web瀏覽器或者手機(jī)App來直接使用互聯(lián)網(wǎng)產(chǎn)品服務(wù)泌绣,用戶終端將會(huì)把用戶的操作行為請(qǐng)求到網(wǎng)站服務(wù)器钮追,網(wǎng)站服務(wù)器對(duì)請(qǐng)求進(jìn)行響應(yīng),用戶終端(Web瀏覽器或者手機(jī)App)將解析服務(wù)器的響應(yīng)進(jìn)行解析阿迈,通過屏幕或聲音反饋給用戶元媚。
從圖中可以看出用戶直接的體驗(yàn)是通過前端反饋出來的。當(dāng)用戶使用不同互聯(lián)網(wǎng)產(chǎn)品時(shí)苗沧,都會(huì)有不同的體驗(yàn)感覺刊棕,某些客戶端或網(wǎng)頁使用起來很快,點(diǎn)擊請(qǐng)求立即就能有響應(yīng)待逞,某些客戶端或網(wǎng)頁使用起來很慢甥角,點(diǎn)擊某個(gè)按鈕半天沒有響應(yīng),還可以出現(xiàn)客戶端崩潰识樱,最后卸載App或者關(guān)閉網(wǎng)頁嗤无。
今天我們主要來講述一下,互聯(lián)網(wǎng)架構(gòu)設(shè)計(jì)高性能高并發(fā)的一些常用方法和策略怜庸。當(dāng)然優(yōu)秀的互聯(lián)網(wǎng)產(chǎn)品架構(gòu)設(shè)計(jì)從來都是在實(shí)踐過程中不斷優(yōu)化迭代出來的当犯,一開始就企圖就想設(shè)計(jì)一個(gè)包羅萬象的牛逼架構(gòu)做法是行不通的。在互聯(lián)網(wǎng)產(chǎn)品發(fā)展過程中休雌,每個(gè)不同階段的瓶頸指標(biāo)點(diǎn)是不一樣的灶壶,所以優(yōu)秀的架構(gòu)都是不斷迭代優(yōu)化的歷史產(chǎn)物。
一個(gè)優(yōu)秀的產(chǎn)品杈曲,不僅需要在產(chǎn)品交互和客戶端層面做好驰凛,同時(shí)需要在網(wǎng)絡(luò)后端服務(wù)也做到優(yōu)秀,前后端緊密配合才能極大地提升用戶體驗(yàn)担扑。對(duì)于互聯(lián)網(wǎng)產(chǎn)品的高性能架構(gòu)設(shè)計(jì)通常包括以下幾個(gè)大方面:
1)Web瀏覽器高性能設(shè)計(jì)
2)App客戶端高性能設(shè)計(jì)
3)高性能的網(wǎng)絡(luò)和硬件
4)后臺(tái)服務(wù)高性能設(shè)計(jì)
對(duì)于一般的互聯(lián)網(wǎng)產(chǎn)品不需要將以上四個(gè)方面做到盡善盡美恰响,可以依據(jù)自身的發(fā)展階段選取某些方面進(jìn)行優(yōu)先解決和提升。比如一般的創(chuàng)業(yè)公司可能不太需要去關(guān)心網(wǎng)絡(luò)和硬件相關(guān)的事情涌献,因?yàn)槟壳暗尿v訊云或阿里云可以幫助做好這些事情胚宦。
下面我們先來具體介紹前面兩個(gè)方面。
1、Web瀏覽器高性能設(shè)計(jì)
隨著互聯(lián)網(wǎng)瀏覽器的發(fā)展枢劝,現(xiàn)在Web的功能越來越強(qiáng)大井联,所展現(xiàn)的元素越來越豐富,直接導(dǎo)致瀏覽器與后臺(tái)服務(wù)器的連接數(shù)大幅增長(zhǎng)您旁,網(wǎng)絡(luò)傳輸?shù)牧髁吭絹碓酱罄映!eb瀏覽器高性能設(shè)計(jì)方法主要有以下幾點(diǎn):
1)盡量與后臺(tái)服務(wù)器建立長(zhǎng)連接。長(zhǎng)連接的方式可以避免web端和服務(wù)器反復(fù)建立和銷毀連接鹤盒,占用大量客戶端資源蚕脏,同時(shí)也會(huì)給服務(wù)器造成一定的壓力。
2)本地緩存數(shù)據(jù)侦锯,提升訪問效率驼鞭。對(duì)于一些不經(jīng)常更改的圖片和js/css文件可以通過緩存在本地,通過版本號(hào)和hash值來協(xié)商緩存的更新尺碰,從而達(dá)到更快速訪問的用戶體驗(yàn)挣棕。
3)合并頁面請(qǐng)求,達(dá)到減少頁面請(qǐng)求葱蝗,提升網(wǎng)絡(luò)效率的目的穴张。比如多張小圖可以合并為一張圖片來請(qǐng)求细燎,一次預(yù)請(qǐng)求多一點(diǎn)的數(shù)據(jù)两曼。
4)頁面靜態(tài)化處理。對(duì)于某些不經(jīng)常變更的頁面(如新聞玻驻、日志等)可以通過靜態(tài)頁面訪問的方式來請(qǐng)求悼凑,方便后臺(tái)進(jìn)行CDN和緩存。
5)將靜態(tài)請(qǐng)求和動(dòng)態(tài)請(qǐng)求進(jìn)行適當(dāng)?shù)姆蛛x璧瞬。比如圖片從http://img.xxx.com服務(wù)器去拉取户辫,而動(dòng)態(tài)的用戶請(qǐng)求從http://www.xxx.com進(jìn)行拉取。
6)web端異步請(qǐng)求嗤锉。如通過ajax異步化和局部化的操作方式渔欢,減少一些不必要的請(qǐng)求開銷,同時(shí)加快前端處理速度瘟忱。
7)優(yōu)化業(yè)務(wù)處理邏輯奥额。比如對(duì)于數(shù)據(jù)量比較大的頁面列表,需要進(jìn)行分頁請(qǐng)求访诱,數(shù)據(jù)量限制等垫挨。對(duì)于12306網(wǎng)站業(yè)務(wù)處理邏輯優(yōu)化的一個(gè)重點(diǎn)就在于分時(shí)段開售火車票,以往是大量請(qǐng)求在同一時(shí)間搶票触菜,這是一個(gè)業(yè)務(wù)邏輯處理的錯(cuò)誤九榔,不同的列車就可以通過不同的時(shí)間段來售賣,這樣可以分散到請(qǐng)求壓力。
8)減少cookie傳輸哲泊。cookie在每次請(qǐng)求和響應(yīng)中都會(huì)得到傳輸剩蟀,臨時(shí)和不必要的cookie會(huì)使得請(qǐng)求數(shù)據(jù)量增加。
2切威、App客戶端高性能設(shè)計(jì)
對(duì)于開發(fā)者來說喻旷,App客戶端有更大的自主性,對(duì)優(yōu)化性能方面能做更多事情牢屋。來看看且预,從app端進(jìn)行高性能設(shè)計(jì)具體有哪些方法。
1)緩存技術(shù)烙无。app客戶端是作為操作系統(tǒng)的一個(gè)獨(dú)立進(jìn)程運(yùn)行的锋谐,相對(duì)Web端瀏覽器有更大的發(fā)揮空間。對(duì)于數(shù)據(jù)量比較大的資源截酷、圖片的緩存涮拗,可以充分利用內(nèi)存、本地磁盤和網(wǎng)絡(luò)存儲(chǔ)三個(gè)方面來進(jìn)行緩存迂苛,可以在客戶端上建立一套緩存機(jī)制三热,采用LRU或LFU調(diào)度方式管理緩存,用于支撐app更高效的運(yùn)行三幻。比如圖片的存儲(chǔ)就漾,可以先從內(nèi)存中讀取,如果內(nèi)存沒有可以從磁盤上讀取念搬,如果再?zèng)]有再通過網(wǎng)絡(luò)請(qǐng)求讀取抑堡。
2)資源預(yù)加載±驶玻基于業(yè)務(wù)邏輯首妖、用戶歷史行為和安全機(jī)制對(duì)于用戶行為進(jìn)行一定預(yù)測(cè),在用戶未請(qǐng)求前就預(yù)先加載一部分資源爷恳。比如目前社交類app應(yīng)用下拉時(shí)預(yù)加載部分?jǐn)?shù)據(jù)有缆。
3)建立長(zhǎng)連接,適當(dāng)壓縮數(shù)據(jù)温亲,減少資源的浪費(fèi)棚壁。
4)路由計(jì)劃表。針對(duì)用戶的歷史連接行為铸豁,后臺(tái)接入服務(wù)的控制策略灌曙,制定一份接入站點(diǎn)的路由計(jì)劃表,為用戶選擇最優(yōu)的接入站點(diǎn)节芥。對(duì)于一般的用戶在刺,他們的網(wǎng)絡(luò)環(huán)境的切換會(huì)相對(duì)的固定逆害,那么對(duì)于某一個(gè)確定的用戶大部分時(shí)間來說,客戶端是知道連接到哪里是最快的蚣驼。
5)請(qǐng)求異步化魄幕。app客戶端可以通過多線程來異步化請(qǐng)求,提升app的請(qǐng)求吞吐量颖杏。
6)優(yōu)化業(yè)務(wù)邏輯纯陨,比如列表分頁、異步發(fā)布上傳留储,緩存讀取等翼抠。例如:你在發(fā)表朋友圈的時(shí)候,微信客戶端顯示發(fā)布成功获讳,其實(shí)在后臺(tái)不一定是發(fā)布成功了阴颖,而是寫入到本地成功了,后續(xù)再通過異步發(fā)送到后臺(tái)服務(wù)器的丐膝。
本篇文章主要從前端介紹了高性能架構(gòu)的設(shè)計(jì)方法量愧,供開發(fā)程序員朋友在優(yōu)化演進(jìn)自己的產(chǎn)品時(shí)參考。但是后端服務(wù)的高性能在互聯(lián)網(wǎng)產(chǎn)品架構(gòu)設(shè)計(jì)中占有更大的比重帅矗。這一部分會(huì)將會(huì)在下期文章中得到闡述偎肃。
轉(zhuǎn)自原文:https://zhuanlan.zhihu.com/p/28340003