Batch Requests

今天聽 sofish 分享了好多。感覺還是回來寫一下這個比較好。
我不知道在場多少人了解這個事情,至少我?guī)サ男』锇槎际撬贫嵌?br> 正好好久不寫技術(shù)東西,來了心情,那就不能浪費(fèi)。
為什么我沒有現(xiàn)場講呢?
因?yàn)闆]圖我只能說個杰寶啊。


[合并請求] 這個需求來源點(diǎn)是:我們有太多的請求,影響性能,不如合并一起發(fā)送,減少 HTTP 請求數(shù)量。

這里,請求分兩類

  • 靜態(tài)資源
  • 展現(xiàn)數(shù)據(jù)

靜態(tài)數(shù)據(jù)

這個比較好處理,簡單粗暴的方式就是

  • 編譯的時候把多個 CSS 合并了
  • 編譯的時候把多個 JS 合并了
  • 把以上兩個放到 CDN 上
  • 文檔加載合并后的文件后的文件

展現(xiàn)數(shù)據(jù)

異步請求一般用的是相對復(fù)雜的過程,這個過程中,需要前后端的配合。

肯定不能是兩個接口,分開的時候請求/aaa 和 /bbb,合并的時候請求/ccc,這也太2了。

大致就是這樣一個過程:

br.png

其實(shí)就做了四件事情

  • B 端的 Interceptor 攔截請求,分發(fā)結(jié)果。
  • S 端的 Filter 分發(fā)請求,拼裝返回。

約定數(shù)據(jù)結(jié)構(gòu)

請求大致會是這個樣子

"requests": [
  {
    "seq":"0",
    "api":"aaa",
    "data":"111"
  },{
    "seq":"1",
    "api":"bbb",
    "data":"222"
  }
]

返回大致會是這個樣子

"responses": [
  {
    "seq":"0",
    "data":"oo"
  },{
    "seq":"1",
    "data":"xx"
  }
]

攔截

  • 攔截所有請求,Hold 住
  • 第一個進(jìn)來開始計(jì)時
  • 大致 20ms 內(nèi)所有請求組成一個 Batch Request 發(fā)出去

分發(fā)

  • 解析出哪些 api
  • 解析出對應(yīng) data
  • 扔給 Controller 去執(zhí)行
  • Hold 住 Controller 結(jié)果

拼裝

  • Controller 都搞定以后,就是把結(jié)果拼裝成要的樣子……

分發(fā)

  • 解析結(jié)果
  • 對應(yīng)結(jié)果塞到對應(yīng) callback 里去,順手轉(zhuǎn)一下 scope

整個過程對于前端和后端開發(fā)都是透明的。
前端來看我發(fā)出去是一個一個的。
后端來看我接收到的也是一個一個的。
不足是,所有交互都會有差不多 20ms 的延遲。

5年前我們就是這樣做的。

反正我是一個渣渣,哪里寫錯了,有本事你來咬我呀!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容