觸屏版
全國(guó)服務(wù)熱線:0571-87205688
登錄
注冊(cè)
客戶中心
關(guān)注云客
本文是Web前端性能優(yōu)化系列文章中的第六篇,主要講述內(nèi)容:減少DNS查找、避免重定向.完整教程可查看:Web前端性能優(yōu)化
一、減少DNS查找
基礎(chǔ)知識(shí)
DNS(Domain Name System): 負(fù)責(zé)將域名URL轉(zhuǎn)化為服務(wù)器主機(jī)IP.
DNS查找流程:首先查看瀏覽器緩存是否存在,不存在則訪問(wèn)本機(jī)DNS緩存,再不存在則訪問(wèn)本地DNS服務(wù)器.所以DNS也是開銷,通常瀏覽器查找一個(gè)給定URL的IP地址要花費(fèi)20-120ms,在DNS查找完成前,瀏覽器不能從host那里下載任何東西.
TTL(Time To Live):表示查找返回的DNS記錄包含的一個(gè)存活時(shí)間,過(guò)期則這個(gè)DNS記錄將被拋棄.
影響DNS緩存的因素
1. 服務(wù)器可以設(shè)置TTL值表示DNS記錄的存活時(shí)間.本機(jī)DNS緩存將根據(jù)這個(gè)TTL值判斷DNS記錄什么時(shí)候被拋棄,這個(gè)TTL值一般都不會(huì)設(shè)置很大,主要是考慮到快速故障轉(zhuǎn)移的問(wèn)題.
2. 瀏覽器DNS緩存也有自己的過(guò)期時(shí)間,這個(gè)時(shí)間是獨(dú)立于本機(jī)DNS緩存的,相對(duì)也比較短,例如chrome只有1分鐘左右.
3. 瀏覽器DNS記錄的數(shù)量也有限制,如果短時(shí)間內(nèi)訪問(wèn)了大量不同域名的網(wǎng)站,則較早的DNS記錄將被拋棄,必須重新查找.不過(guò)即使瀏覽器丟棄了DNS記錄,操作系統(tǒng)的DNS緩存也有很大機(jī)率保留著該記錄,這樣可以避免通過(guò)網(wǎng)絡(luò)查詢而帶來(lái)的延遲.
最佳實(shí)踐
當(dāng)客戶端的DNS緩存為空時(shí),DNS查找的數(shù)量與Web頁(yè)面中唯一主機(jī)名的數(shù)量相等.所以減少唯一主機(jī)名的數(shù)量就可以減少DNS查找的數(shù)量.
然而減少唯一主機(jī)名的數(shù)量會(huì)潛在地減少頁(yè)面中并行下載的數(shù)量,避免DNS查找降低了響應(yīng)時(shí)間,但減少并行下載可能會(huì)增加響應(yīng)時(shí)間.當(dāng)頁(yè)面的組件量比較多的時(shí)候,可以考慮將組件分別放到至少2-4個(gè)主機(jī)名,已獲得最大收益.
延伸閱讀: CloudXNS免費(fèi)DNS服務(wù):線路細(xì)分 宕機(jī)監(jiān)控等 減少域名DNS解析時(shí)間將網(wǎng)頁(yè)加載速度提升新層次 盤點(diǎn)十大免費(fèi)DNS域名解析服務(wù):穩(wěn)定、可靠 國(guó)內(nèi)免費(fèi)DNS服務(wù)使用評(píng)測(cè):360DNS、ZnDNS等
二、避免重定向
什么是重定向?
重定向用于將用戶從一個(gè)URL重新路由到另一個(gè)URL.
常用重定向的類型
301:永久重定向,主要用于當(dāng)網(wǎng)站的域名發(fā)生變更之后,告訴搜索引擎域名已經(jīng)變更了,應(yīng)該把舊域名的的數(shù)據(jù)和鏈接數(shù)轉(zhuǎn)移到新域名下,從而不會(huì)讓網(wǎng)站的排名因域名變更而受到影響.
302:臨時(shí)重定向,主要實(shí)現(xiàn)post請(qǐng)求后告知瀏覽器轉(zhuǎn)移到新的URL.
304:Not Modified,主要用于當(dāng)瀏覽器在其緩存中保留了組件的一個(gè)副本,同時(shí)組件已經(jīng)過(guò)期了,這是瀏覽器就會(huì)生成一個(gè)條件GET請(qǐng)求,如果服務(wù)器的組件并沒(méi)有修改過(guò),則會(huì)返回304狀態(tài)碼,同時(shí)不攜帶主體,告知瀏覽器可以重用這個(gè)副本,減少響應(yīng)大小.
重定向如何損傷性能?
當(dāng)頁(yè)面發(fā)生了重定向,就會(huì)延遲整個(gè)HTML文檔的傳輸.在HTML文檔到達(dá)之前,頁(yè)面中不會(huì)呈現(xiàn)任何東西,也沒(méi)有任何組件會(huì)被下載.
來(lái)看一個(gè)實(shí)際例子:對(duì)于 webform開發(fā)來(lái)說(shuō),對(duì)于新手很容易犯一個(gè)錯(cuò)誤,就是把頁(yè)面的連接寫成服務(wù)器控件后臺(tái)代碼里,例如用一個(gè)Button控件,在它的后臺(tái)click事件中寫上:("");然而這個(gè)Button的作用只是轉(zhuǎn)移URL,這是非常低效的做法,因?yàn)辄c(diǎn)擊Button后,先發(fā)送一個(gè)Post請(qǐng)求給服務(wù)器,服務(wù)器處理("")后就發(fā)送一個(gè)302響應(yīng)給瀏覽器,瀏覽器再根據(jù)響應(yīng)的URL發(fā)送GET請(qǐng)求.正確的做法應(yīng)該是在html頁(yè)面直接使用a標(biāo)簽做鏈接,這樣就避免了多余的post和重定向.
重定向的應(yīng)用場(chǎng)景
1. 跟蹤內(nèi)部流量
當(dāng)擁有一個(gè)門戶主頁(yè)的時(shí)候,同時(shí)想對(duì)用戶離開主頁(yè)后的流量進(jìn)行跟蹤,這時(shí)可以使用重定向.以為例,主頁(yè)新聞的鏈接主機(jī)名是,后面跟著識(shí)別的參數(shù),點(diǎn)擊后再產(chǎn)生一個(gè)301重定向,這樣就記錄了離開門戶主頁(yè)后的流量去向.
我們知道重定向是如何損傷性能的,為了實(shí)現(xiàn)更好的效率,可以使用Referer日志來(lái)跟蹤內(nèi)部流量去向.每個(gè)HTTP請(qǐng)求都有一個(gè)Referer表示原始請(qǐng)求頁(yè)(除了從書簽打開或直接鍵入U(xiǎn)RL等操作),記錄下每個(gè)請(qǐng)求的Referer,就避免了向用戶發(fā)送重定向,從而改善了響應(yīng)時(shí)間.
2. 跟蹤出站流量
有時(shí)鏈接可能將用戶帶離你的網(wǎng)站,在這種情況下,使用Referer就不太現(xiàn)實(shí)了.
同樣也可以使用重定向來(lái)解決跟蹤出站流量問(wèn)題.以百度搜索為例,百度通過(guò)將每個(gè)鏈接包裝到一個(gè)302重定向來(lái)解決跟蹤的問(wèn)題,例如搜索關(guān)鍵字"跟蹤出站流量",搜索結(jié)果的第一個(gè)URL為后面跟著一連串字符,即使搜索結(jié)果并沒(méi)有變,但這個(gè)字符串是動(dòng)態(tài)改變的,我認(rèn)為這里的搜索連接URL好像沒(méi)有改變的需要,不知道這里起到怎樣的作用?
除了重定向外,我們還可以選擇使用信標(biāo)(beacon)--一個(gè)HTTP請(qǐng)求,其URL中包含有跟蹤信息.跟蹤信息可以從信標(biāo)Web服務(wù)器的訪問(wèn)日記中提取出來(lái),信標(biāo)通常是一個(gè)1px*1px的透明圖片,不過(guò)204響應(yīng)更優(yōu)秀,因?yàn)樗?從來(lái)不被緩存,而且絕不會(huì)改變?yōu)g覽器的狀態(tài).
評(píng)論(0人參與,0條評(píng)論)
發(fā)布評(píng)論
最新評(píng)論