為什么前端項目開發(fā)不都采用 WebSocket?
當(dāng)前位置:點(diǎn)晴教程→知識管理交流
→『 技術(shù)文檔交流 』
在前端圈子里面, 畢竟,WebSocket 能做到 全雙工通信,還能讓前端和后端像打電話一樣實(shí)時對話,聽上去就是 HTTP 的“終極替代品”。 那問題來了:既然 WebSocket 這么強(qiáng),為什么今天的 Web 應(yīng)用沒有全面拋棄 HTTP,只用 WebSocket? 你可能會想:微信、釘釘這些聊天軟件,不也是靠類似的技術(shù)支撐的嗎?它們能支撐上億用戶同時在線,那咱們的業(yè)務(wù)系統(tǒng)用 WebSocket,不就能統(tǒng)一交互方式、實(shí)時性直接拉滿了? 很遺憾,事情遠(yuǎn)沒有這么簡單。 如果你真把所有接口都塞進(jìn) WebSocket,不僅不會變輕松,反而會掉進(jìn)一個又一個大坑。 今天,我們就來拆解一下:
為什么會出現(xiàn) WebSocket?在 WebSocket 出現(xiàn)之前,前端要想實(shí)現(xiàn)“實(shí)時通信”,基本只能靠兩種老辦法:
這兩種方案其實(shí)都不好。 所以,在 2011 年,WebSocket 協(xié)議(RFC 6455) 橫空出世。 它的核心思想很簡單:
這在當(dāng)年絕對是革命性的體驗:實(shí)時性大幅提升,同時 服務(wù)器壓力也大幅度下降。 也正是因為這樣,WebSocket 一度被視為 “Web 實(shí)時通信的未來”。 WebSocket 的優(yōu)勢都有什么?雖然現(xiàn)在大家對 WebSocket 的評價趨于理性,但不得不承認(rèn),它依舊有一些“別人替代不了”的獨(dú)家優(yōu)勢: 1. 所有消息走一條連接,時序可控傳統(tǒng) HTTP 請求是 一次一條通道,并行時序靠隊列調(diào)度,沒法保證嚴(yán)格的先后順序。 而 WebSocket 不一樣:所有請求、響應(yīng)、通知消息都在同一條連接上傳輸。 這意味著你能精準(zhǔn)掌控消息的時序:誰先誰后,完全由你決定。 2. 一次鑒權(quán),狀態(tài)長期有效在 HTTP 世界里,每次請求都得帶上 Token、Cookie 等鑒權(quán)信息,服務(wù)端要一遍遍校驗。 WebSocket 則更簡單:連接建立時完成一次認(rèn)證,后續(xù)所有消息都基于同一個連接。換句話說,它天然就是“有狀態(tài)”的通信方式,管理起來省心很多。 看起來是不是很爽? 但很遺憾,優(yōu)勢只有這兩條。 剩下的都是問題..... ?WebSocket 的缺陷都有啥光看上面的介紹,你會感覺 但是,如果你真的想要把 所有接口都搬到 WebSocket 上時,很快就會被教育了。 因為 WebSocket 帶來的問題,往往比它解決的問題還多: 1. 認(rèn)證機(jī)制不如 HTTP 簡單握手階段可以帶 Cookie 或 Token,但一旦連接建立,后續(xù)就是裸 TCP 流了。 想用 Header 做認(rèn)證?不好意思,已經(jīng)沒有 HTTP 頭了。 這就意味著你需要自己在消息體里定義認(rèn)證字段,或者額外維護(hù)一套“請求上下文”。 2. 跨域風(fēng)險更高HTTP 有 如果不額外校驗 3. 請求與響應(yīng)要自己匹配HTTP 天然是一問一答。 但是,WebSocket 沒這個約束,你必須用 4. 中間件和生態(tài)缺失HTTP 里日志、監(jiān)控、路由、緩存都有現(xiàn)成中間件。 但是,WebSocket 世界?幾乎得自己造輪子,連調(diào)試都麻煩。 5. 部署和代理更復(fù)雜不是所有代理、負(fù)載均衡器都默認(rèn)支持 WebSocket。 配置不當(dāng)?shù)脑挘?/span> 所以說,WebSocket 很酷,但坑點(diǎn)也很硬核。 你要是把 CRUD 接口都放進(jìn)去,絕對是“自找麻煩”。 WebSocket、SSE、HTTP 各自應(yīng)該怎么選那么根據(jù)以上內(nèi)容,大家應(yīng)該就可以知道:WebSocket 是不可以無腦使用的。 那么具體應(yīng)該怎么用呢? 1. 常規(guī)請求:老老實(shí)實(shí)用 HTTP像用戶登錄、商品下單、列表查詢這類 標(biāo)準(zhǔn) CRUD 操作,HTTP 永遠(yuǎn)是最優(yōu)解。 2. 單向推送:優(yōu)先 SSE(EventSource)如果你的場景是 服務(wù)端推消息給前端,比如:
這類單向?qū)崟r推送,SSE 更合適: 3. 雙向交互:再考慮 WebSocket只有在確實(shí)需要 雙向通信 的時候,才該上 WebSocket,比如:
這種場景下,客戶端要告訴服務(wù)端“我訂閱了哪個頻道”,服務(wù)端再有針對性地推送。 給大家一個表單,來更清楚的展示 websocket、SSE、長輪詢、HTTP 的使用場景: ![]() 閱讀原文:原文鏈接 該文章在 2025/9/2 17:13:05 編輯過 |
關(guān)鍵字查詢
相關(guān)文章
正在查詢... |