<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          面試官:為什么要合并 HTTP 請求?

          共 1959字,需瀏覽 4分鐘

           ·

          2021-10-21 23:29

          來源:https://www.jianshu.com/p/9a3f0e84c2b0

          思考路徑:

          為什么要實(shí)現(xiàn)batch call? -> 減少網(wǎng)絡(luò)中的傳輸損耗 -> 如何減少的? -> 通過合并HTTP請求 -> 合并HTTP請求是如何減少網(wǎng)絡(luò)損耗的?

          本文將解決這個問題。一起看看單個請求攜載大量信息和多個請求攜載小量信息對于整個時間的影響。

          1. Client發(fā)出請求

          1.1 HTTP 1.1

          可以保持長連接,但是每個不同的請求之間,client要向server發(fā)一個請求頭
          請求無法并行執(zhí)行的,在一個連接里面

          假設(shè)如果不合并的話需要建立N個連接,那么合并就可以省去(N-1)*RTT的時間,RTT指網(wǎng)絡(luò)延遲(在傳輸介質(zhì)中傳輸所用的時間,即從報文開始進(jìn)入網(wǎng)絡(luò)到它開始離開網(wǎng)絡(luò)之間的時間)。

          1.2 TCP丟包問題

          慢啟動,擁塞控制窗口

          TCP報文亂序到達(dá),合并后的文件可以允許隊首丟包以后在隊中補(bǔ)上來,但是分開資源的時候,前一個資源未加載完成后面的資源是不能加載的,會有更嚴(yán)重的隊首阻塞問題,丟包率會嚴(yán)重影響Keep alive情況下多個文件的傳輸速率。

          1.3 瀏覽器線程數(shù)限制

          多為2-6個線程,會在每個連接上串行發(fā)送若干個請求。TCP連接太多,會給服務(wù)器造成很大的壓力的。

          1.4 DNS緩存問題

          每次請求都需要找DNS緩存,多個請求就需要查找多次,而且緩存有可能被無故清空

          2. 服務(wù)器處理請求

          每個請求需要使用一個連接,建立一個線程,分配一部分CPU, 對于CPU而言,是種負(fù)擔(dān),尤其是一般來說建立了連接以后,哪怕發(fā)回了請求,這個連接還會保持一段時間才會timeout。

          這種時候,維持連接是對服務(wù)器資源的一種巨大的浪費(fèi)。

          3. HTTP 2.0

          上面描述的所有都是基于HTTP/1.1的一些特性,或者說弊端,有長連接但是無法并行處理請求,TCP的慢啟動和擁塞控制,隊首阻塞問題都給整個性能帶來很多弊端,因此我們有了HTTP2.0來做針對性的改進(jìn)。很有意思的東西,直接看圖:

          HTTP/1.1 network的請求圖
          HTTP/2 network的請求圖

          就是這么酷炫,HTTP/2多了很多特性來解決HTTP/1.1的很多問題

          3.1 Fully multiplexed

          解決了隊首阻塞的問題。對于同一個TCP連接,現(xiàn)在可以發(fā)送多個請求,接收多個回應(yīng)了!在HTTP/1.1里面,如果在一個連接里上一個請求發(fā)生了丟包,那么后面的所有請求都必須等第一個請求補(bǔ)上包,收到回應(yīng)以后才能繼續(xù)執(zhí)行。而在HTTP/2里面,可以直接并行處理。

          另外,HTTP 系列面試題和答案全部整理好了,微信搜索互聯(lián)網(wǎng)架構(gòu)師,在后臺發(fā)送:2T,可以在線閱讀。

          3.2 Header Compression

          所有的HTTP request和response都有header,但是header里很可能包含緩存信息,導(dǎo)致他的大小會迅速增大的。但是在一個連接里大部分請求的請求頭其實(shí)攜帶的信息都很類似,所以HTTP/2使用了索引表,存儲了第一次出現(xiàn)的請求的請求頭,然后后面的類似的請求只需要攜帶這個索引的數(shù)字就好了。頭部壓縮平均減少了30%的頭部大小,加快了整體的網(wǎng)絡(luò)中傳輸?shù)乃俣取?/span>

          這兩點(diǎn)是和本文關(guān)系最大的,有了這兩點(diǎn),實(shí)質(zhì)上合并HTTP請求的好處在HTTP/2的協(xié)議下,已經(jīng)基本上消失了。合并不合并請求,更多的是看業(yè)務(wù)上的需求,后端的一些配置。

          4. 總結(jié)

          It’s a trade-off. 其實(shí)最重要的是看你傳輸什么東西,因為合并HTTP請求實(shí)質(zhì)上是減少了網(wǎng)絡(luò)延時,但是如果你在服務(wù)器上處理的時間遠(yuǎn)遠(yuǎn)大于網(wǎng)絡(luò)延時的時間的時候,那么合并HTTP請求并不會給你帶來很多性能上的提升。

          而且大數(shù)據(jù)量的傳輸一定會降低瀏覽器的cache hit rate,對于緩存的利用率會降低很多。但是對于HTTP請求攜帶的數(shù)據(jù)量比較少的情況,合并請求帶來的性能提升會是顯而易見的。

          Reference

          https://www.zhihu.com/question/34689035
          https://www.zhihu.com/question/34401250
          https://deliciousbrains.com/performance-best-practices-http2/
          https://www.tutorialdocs.com/article/merge-parallel-http-request.html



          PS:如果覺得我的分享不錯,歡迎大家隨手點(diǎn)贊、轉(zhuǎn)發(fā)、在看。

          瀏覽 55
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  成人免费毛片 嘿嘿连载视频 | 中国学生妹做爱视频 | 哪个网站可以看毛片 | 不卡高清无码在线 | 亚洲乱伦熟妇 |