好文必看!HTTP?推送功能最新缺點&優(yōu)點解剖

添加微信公眾號《Linux就該這么學(xué)》潜叛,掌握最新IT資訊動態(tài)秽褒,免費領(lǐng)取Linux課程以及專業(yè)的RHCE考前答疑服務(wù)。

《Linux就該這么學(xué)》在線免費閱讀地址:http://www.linuxprobe.com/

純手工打造每一篇開源資訊與技術(shù)干貨威兜,數(shù)十萬程序員和Linuxer已經(jīng)關(guān)注

導(dǎo)讀

上周我在斯達哥爾摩住了幾天销斟,出席了?HTTP 研討會,參與了不少吸引人的討論椒舵。其中一次是關(guān)于 HTTP 推送及其優(yōu)缺點蚂踊、早期實驗結(jié)果的。

由于早期實驗部署結(jié)果不那么理想笔宿,人們對 HTTP 推送大體持著懷疑態(tài)度犁钟,不過我想分享下自己更樂觀一些的觀點。

HTTP 推送能做哪些預(yù)加載不能做的事措伐?

從懷疑者那里一再聽到的觀點是特纤,“推送相對于預(yù)加載來說,只不過節(jié)省了一次 RTT(Round Trip Time)而已”侥加。在實踐中捧存,這并非總是對的,有一個使用案例担败,推送可以完成昔穴,但預(yù)加載無法做到。

利用服務(wù)器思考時間

如今提前,HTML 響應(yīng)很少只是單純的靜態(tài)資源了吗货。它們通常都是通過數(shù)據(jù)庫獲取所需的信息、使用高級語言(可能略微慢一些)動態(tài)生成的狈网。雖然后端響應(yīng)時間確實可以而且應(yīng)當(dāng)優(yōu)化宙搬,但幾百毫秒的響應(yīng)時間也并不常見笨腥。
????有一個常見的建議,“提早 flush” HTML勇垛,在查詢數(shù)據(jù)庫并構(gòu)建動態(tài)內(nèi)容的同時脖母,發(fā)送 HTML 的首個 chunk 塊。但是闲孤,并非所有服務(wù)端的構(gòu)架都能這么簡單地實現(xiàn)谆级。
????另外一個讓問題變得困難的因素是,需要開始向瀏覽器發(fā)送數(shù)據(jù)時讼积,我們尚無法確定響應(yīng)的構(gòu)建是否會完全成功肥照。為避免出現(xiàn)響應(yīng)創(chuàng)建邏輯出錯(比如說,數(shù)據(jù)庫錯誤或者服務(wù)端代碼運行失斍谥凇)舆绎,我們需要在應(yīng)用邏輯中創(chuàng)建一種“回滾”已發(fā)送響應(yīng)數(shù)據(jù)的方式,并向用戶展示錯誤信息决摧。
????盡管這肯定有可能做得到(甚至是自動化的)亿蒸,但目前還沒有一種通用的方式能夠作為協(xié)議的一部分。

????因此一般場景是掌桩,Web 服務(wù)器等待后端數(shù)百毫秒以構(gòu)建頁面边锁,而后開始返回數(shù)據(jù)。這時候我們就碰到了慢啟動(譯者注:slow start波岛,可參考此文)茅坛,所以首次 RTT 只能發(fā)送大約 14 KB 數(shù)據(jù),第二次 28 KB 左右则拷,如此等等贡蓖。由此我們知道,將 HTML 發(fā)送出去煌茬,需要用去服務(wù)器思考時間加上慢啟動時間斥铺。在思考時間期間挽放,瀏覽器對接下來所需的資源一無所知篮绰,故也不會針對接下來所需資源的關(guān)鍵路徑發(fā)送任何請求。
????而且波桩,即使我們試著耍小聰明眠屎,針對那些資源添加?preload 報頭剔交,若我們不提早 flush 文檔開頭,那還是沒有對思考時間加以利用改衩。
????現(xiàn)在岖常,將這個與使用 HTTP 推送能做的事情做個對比。服務(wù)器可以利用思考時間來推送相關(guān)的關(guān)鍵性資源 —— 尤其是 CSS 和 JS葫督。這樣一來竭鞍,當(dāng)思考時間結(jié)束時板惑,我們極有可能已將所有關(guān)鍵性資源都推送給瀏覽器了。
????還有額外好處笼蛛,這些資源也預(yù)熱了 TCP 連接洒放,也提升了擁塞窗口,確保思考時間之后的首個 RTT 中滨砍,可以使用 28 KB,56 KB妖异,乃至更大的擁塞窗口發(fā)送 HTML(這取決于思考時間的長短惋戏,以及在此期間我們推送了多少資源)。
????一起來看下具體案例:一個 120 KB 的 HTML 頁面他膳,關(guān)鍵 CSS 有 24KB响逢,關(guān)鍵 JS 有 74 KB,在 100ms RTT棕孙、無限帶寬的網(wǎng)絡(luò)環(huán)境下是如何加載的舔亭?
沒有 HTTP 推送的情況下,生成 HTML 等待了 300ms蟀俊,接著 4 次 RTT 發(fā)送 HTML钦铺,因為慢啟動的緣故,使用了一個 RTT 請求 JS 和 CSS肢预。在首次渲染之前矛洞,時間超過了 800 毫秒。


????使用 HTTP 推送烫映,CSS 和 JS 會在 HTML 請求到達之后盡快推送出去沼本,發(fā)送它們需要 3 個 RTT(又一次因為慢啟動),它們將擁塞窗口增大至 128 KB 左右锭沟,將要發(fā)送 HTML 時抽兆,一個 RTT 就能可以了。首次渲染總時間: 400 毫秒族淮。


首次渲染加速了 50%辫红!也不算很差嘛。瞧筛。厉熟。

HTTP 推送不盡如意的地方

我認為人們在錯誤地使用?HTTP 推送的原因之一是,他們在某些并不能提供任何好處甚至損害效率的場景下使用它较幌。

盲目推送靜態(tài)資源

使用 HTTP 推送可能做的錯事之一就是告訴你自己揍瑟,“啊,這些資源是所有頁面都需要的乍炉,把它們配置成所有頁面都推送”绢片。
????這很糟糕滤馍,原因是緩存。在訪問第一個頁面之后底循,這些資源很可能就在用戶的瀏覽器緩存中巢株,然而你卻在悶頭推送。你可能會爭辯說熙涤,這可比內(nèi)聯(lián)所有這些資源好多了阁苞。是這樣的,不錯祠挫,但那槽,我必須反過來告訴你,內(nèi)聯(lián)資源也是糟糕的主意等舔。
????所以骚灸,若你在以這種方式盲目推送資源,請確保它是你想要內(nèi)聯(lián)在頁面中的唯一的資源慌植,也就是關(guān)鍵的 CSS甚牲。否則,你就是在冒險讓重復(fù)的請求變慢蝶柿。
????你可能會以為丈钙,流重置會幫助推送已緩存的資源去避免浪費帶寬和時間。你可能錯了只锭。很顯然著恩,并非所有瀏覽器會檢查緩存并終止已緩存資源的推送。就算它們會這樣蜻展,在流重置信號到達服務(wù)器之前喉誊,還是使用了一整個 RTT 時間發(fā)送數(shù)據(jù)。尤其是有多個資源時纵顾,這樣做將可能帶來大量數(shù)據(jù)浪費伍茄。

將內(nèi)容放入瀏覽器緩存

你可能以為,推送會將資源放入瀏覽器緩存施逾,可以用來做一些像使當(dāng)前資源失效這樣的工作敷矫。至少目前不是如此。研討會上的討論的話題之一就是現(xiàn)實問題汉额,可能我們需要改變當(dāng)前的推送行為曹仗,支持與瀏覽器緩存直接交互。不過當(dāng)前蠕搜,推送還做不到這些怎茫。推送響應(yīng)進入推送緩存,只有真實請求它們時才會放到 HTTP 緩存中。
????因此轨蛤,如果你在推送資源蜜宪,希望它們在未來的某個頁面中使用,那么瀏覽器有可能在用到它們之前已經(jīng)將它們?nèi)映鐾扑途彺嬷饬恕?br>至少目前的實現(xiàn)是這樣的祥山。

填補 HTML 下發(fā)之后的管道


????通常圃验,在頁面的下載循環(huán)中,使用的帶寬之間會存在間隙缝呕。這意味著我們沒能盡快下發(fā)資源澳窑,通常這是因為瀏覽器發(fā)現(xiàn)資源的延遲。
????盡管我們應(yīng)當(dāng)盡量下發(fā)頁面所需資源以填滿這些間隙岳颇,但通常使用預(yù)加載比推送更好照捡。預(yù)加載將緩存、cookie以及內(nèi)容協(xié)商納入考慮话侧,它不會像推送那樣存在著過度發(fā)送或錯誤發(fā)送的風(fēng)險。就填補這些間隙而言闯参,推送并無任何優(yōu)勢瞻鹏,所有的只是劣勢。故最好不要使用推送達成此目的鹿寨,使用預(yù)加載吧新博。

緩存摘要

從上面我們可以看到,HTTP 推送的一大缺點就是脚草,服務(wù)器并不必然清楚瀏覽器的緩存狀態(tài)赫悄,因此在推送時我們可能會將已在緩存中存在的資源推送出去。
????有一個標準擴展的提案馏慨,叫做?Cache Digests埂淮。其基本思想是瀏覽器在 HTTP/2 連接初始化之后,向服務(wù)器發(fā)送摘要写隶,服務(wù)器在下發(fā)資源之前能夠精確判斷資源是否已在瀏覽器緩存中存在倔撞。
該提案尚處于早期,可能需要簡化慕趴,這樣實現(xiàn)起來花費更少痪蝇,不過我敢說,離開這個特性冕房,HTTP 推送只能算半成品躏啰。

總結(jié)

HTTP 推送可以用來顯著提升加載性能。正確使用時能為首個關(guān)鍵路徑加載提速耙册,帶來性能指標的改善给僵。
????推送依然是非常新的技術(shù),像其他所有新工具一樣觅玻,在找到使用的最優(yōu)方式之前想际,還有很長的路要走培漏。這一路多少會有點痛苦。
????是故早期實驗的初始結(jié)果胡本,可能并非全如我們所希望的那樣牌柄。讓我們把那些結(jié)果作為標志,指示我們關(guān)于推送的使用需要更多聰明才智吧侧甫,別妄下結(jié)論說它是無用的特性珊佣。

原文來自:https://linux.cn/article-7844-1.html

本文地址:http://www.linuxprobe.com/http-pushed.html編輯:鄭帥,審核員:逄增寶


讓您學(xué)習(xí)到的每一節(jié)課都有所收獲

《Linux就該這么學(xué)》是由資深運維專家劉遄及全國多名紅帽架構(gòu)師(RHCA)基于最新RHEL7系統(tǒng)共同編寫的高質(zhì)量Linux技術(shù)自學(xué)教程披粟,極其適合用于Linux技術(shù)入門教程或講課輔助教材咒锻。

? 劉遄老師QQ:5604241

? 學(xué)員助教QQ:5604674

? Linux技術(shù)交流A群(滿):560843

? Linux技術(shù)交流B群:340829

? Linux技術(shù)交流C群:463590

? 官方站點:www.linuxprobe.com

? 電腦在線閱讀效果更佳:

http://www.linuxprobe.com/chapter-00.html

按住圖片3秒,即可自動關(guān)注守屉。

點擊左下角查看更多熱門技術(shù)

添加微信公眾號《Linux就該這么學(xué)》惑艇,掌握最新IT資訊動態(tài),免費領(lǐng)取Linux課程以及專業(yè)的RHCE考前答疑服務(wù)拇泛。

《Linux就該這么學(xué)》在線免費閱讀地址:http://www.linuxprobe.com/


閱讀原文:http://mp.weixin.qq.com/s?timestamp=1477962149&src=3&ver=1&signature=xtUlRO9lW3xIDm7lgRgL-J3-ZcE5KwnD1pL0g8PBM4Gog33f6H*2ZRMABijf36xK5k0n4lsXkpS7F4rdF9tlbk45KaP3iq1JipmC8VZ55Tiy1EBAmRQBlzs8tAwGjeqvbHUbd8ygZ5JuuizS0bMrlC9PEX8YNUcnette8F0Ak-8=
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末滨巴,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子俺叭,更是在濱河造成了極大的恐慌恭取,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,525評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件熄守,死亡現(xiàn)場離奇詭異蜈垮,居然都是意外死亡,警方通過查閱死者的電腦和手機裕照,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評論 3 395
  • 文/潘曉璐 我一進店門攒发,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人牍氛,你說我怎么就攤上這事晨继。” “怎么了搬俊?”我有些...
    開封第一講書人閱讀 164,862評論 0 354
  • 文/不壞的土叔 我叫張陵紊扬,是天一觀的道長。 經(jīng)常有香客問我唉擂,道長餐屎,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,728評論 1 294
  • 正文 為了忘掉前任玩祟,我火速辦了婚禮腹缩,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己藏鹊,他們只是感情好润讥,可當(dāng)我...
    茶點故事閱讀 67,743評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著盘寡,像睡著了一般楚殿。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上竿痰,一...
    開封第一講書人閱讀 51,590評論 1 305
  • 那天脆粥,我揣著相機與錄音,去河邊找鬼影涉。 笑死变隔,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蟹倾。 我是一名探鬼主播匣缘,決...
    沈念sama閱讀 40,330評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼鲜棠,長吁一口氣:“原來是場噩夢啊……” “哼孵户!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起献联,我...
    開封第一講書人閱讀 39,244評論 0 276
  • 序言:老撾萬榮一對情侶失蹤原押,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后偎血,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體诸衔,經(jīng)...
    沈念sama閱讀 45,693評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,885評論 3 336
  • 正文 我和宋清朗相戀三年颇玷,在試婚紗的時候發(fā)現(xiàn)自己被綠了笨农。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,001評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡帖渠,死狀恐怖谒亦,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤份招,帶...
    沈念sama閱讀 35,723評論 5 346
  • 正文 年R本政府宣布切揭,位于F島的核電站,受9級特大地震影響锁摔,放射性物質(zhì)發(fā)生泄漏廓旬。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,343評論 3 330
  • 文/蒙蒙 一鄙漏、第九天 我趴在偏房一處隱蔽的房頂上張望嗤谚。 院中可真熱鬧,春花似錦怔蚌、人聲如沸巩步。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽椅野。三九已至,卻和暖如春籍胯,著一層夾襖步出監(jiān)牢的瞬間竟闪,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評論 1 270
  • 我被黑心中介騙來泰國打工杖狼, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留炼蛤,地道東北人。 一個月前我還...
    沈念sama閱讀 48,191評論 3 370
  • 正文 我出身青樓蝶涩,卻偏偏與公主長得像理朋,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子绿聘,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,955評論 2 355

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理嗽上,服務(wù)發(fā)現(xiàn),斷路器熄攘,智...
    卡卡羅2017閱讀 134,657評論 18 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,144評論 25 707
  • Http協(xié)議詳解 標簽(空格分隔): Linux 聲明:本片文章非原創(chuàng)兽愤,內(nèi)容來源于博客園作者MIN飛翔的HTTP協(xié)...
    Sivin閱讀 5,223評論 3 82
  • 1. 網(wǎng)絡(luò)基礎(chǔ)TCP/IP HTTP基于TCP/IP協(xié)議族,HTTP屬于它內(nèi)部的一個子集挪圾。 把互聯(lián)網(wǎng)相關(guān)聯(lián)的協(xié)議集...
    yozosann閱讀 3,444評論 0 20
  • 今天上午從海尼出發(fā)浅萧,差不多2點到地鐵人民路站,路遇一奇葩老賴在搶抓車票洛史,我們不幸中招惯殊,4張票有2張空票。 人最怕獨...
    Jenefer閱讀 137評論 0 0