HTTP 長輪詢
它解決了在 Web 上構(gòu)建雙向應(yīng)用程序的問題 — 一個(gè)專為客戶端發(fā)出請求而服務(wù)器響應(yīng)的單向世界而設(shè)計(jì)的平臺。這是通過顛倒請求-響應(yīng)模型來實(shí)現(xiàn)的:
客戶端向服務(wù)器發(fā)送 GET 請求: 與傳統(tǒng)的 HTTP 請求不同,您可以將其視為開放式請求。它不是要求特定的響應(yīng),而是在準(zhǔn)備好時(shí)請求任何響應(yīng)。
時(shí)間流逝: HTTP 超時(shí)可使用 Keep-Alive 標(biāo)頭進(jìn)行優(yōu)化。長輪詢通過設(shè)置非常長或無限期的超時(shí)時(shí)間來利用這一點(diǎn),因此即使服務(wù)器沒有立即響應(yīng),請求也會保持打開狀態(tài)。
服務(wù)器響應(yīng): 當(dāng)服務(wù)器有要發(fā)送的內(nèi)容時(shí),它會通過響應(yīng)關(guān)閉連接。這可能是新的聊天消息、更新的體育比分或突發(fā)新聞提醒。
客戶端發(fā)送新的 GET 請求,然后循環(huán)再次開始。
HTTP 長輪詢成功的關(guān)鍵在于,它不會改變基本原理,尤其是在客戶端上。但是,大多數(shù)工作都需要在服務(wù)器上進(jìn)行。特別是,管理可能數(shù)十萬個(gè)連接的狀態(tài)是資源密集型的。
當(dāng)使服務(wù)器能夠?qū)?shù)據(jù)推送到 Web 客戶端時(shí),HTTP 長輪詢是一種解決方法。它使 HTTP 略微變形,為我們提供了一種廣泛可用的方法,讓 Web 服務(wù)器將數(shù)據(jù)推送到 Web 客戶端。要了解長輪詢在哪些方面有用,我們應(yīng)該看看它在哪些方面做得好,在哪些方面做得不夠。
優(yōu)點(diǎn)和缺點(diǎn)
幾乎在每個(gè) Web 客戶端中都可用: 因?yàn)樗褂没镜?HTTP 請求-響應(yīng)周期,所以幾乎所有允許您調(diào)整超時(shí)并支持 XMLHttpRequest 的支持 HTTP 的客戶端(瀏覽器、庫、IoT 設(shè)備等)都已經(jīng)支持長輪詢。
您的 Web 服務(wù)器已經(jīng)支持它: 盡管您需要編寫自己的代碼來處理輪詢在應(yīng)用程序后端的工作時(shí)間,但長輪詢適用于現(xiàn)有的 Web 基礎(chǔ)架構(gòu)。
未被防火墻阻止: 現(xiàn)代實(shí)時(shí)協(xié)議使用與 HTTP 不同的端口,有些協(xié)議使用 UDP 而不是 TCP。盡管問題比以前小得多,但一些公司防火墻可能會阻止這些協(xié)議,但不會阻止 HTTP。
效率低下且速度慢: 現(xiàn)代實(shí)時(shí)協(xié)議(如 WebSocket)產(chǎn)生的開銷比長輪詢少得多。他們設(shè)置單個(gè)持久連接并根據(jù)需要發(fā)送數(shù)據(jù)。長輪詢需要每次服務(wù)器向客戶端發(fā)送內(nèi)容時(shí)進(jìn)行完整的 HTTP 握手。這會浪費(fèi)帶寬并增加延遲。
規(guī)模有點(diǎn)復(fù)雜: 我們要求它做的越多,長輪詢作為一種解決方法的狀態(tài)就越清晰??缍鄠€(gè)服務(wù)器擴(kuò)展長輪詢意味著在基本無狀態(tài)協(xié)議中跟蹤會話狀態(tài)。
難以做出保證: 很難保證消息會按順序從服務(wù)器到達(dá)客戶端,或者根本無法保證。例如,如果客戶端打開了兩個(gè)使用相同服務(wù)器資源的瀏覽器選項(xiàng)卡,并且客戶端應(yīng)用程序?qū)?shù)據(jù)保存到本地存儲(如 localStorage 或 IndexedDb),則無法內(nèi)置保證不會多次寫入重復(fù)數(shù)據(jù)。
WebSockets 瀏覽器
WebSocket 是一種實(shí)時(shí)技術(shù),它通過持久的單套接字連接在客戶端和服務(wù)器之間實(shí)現(xiàn)雙向、全雙工通信。WebSocket 連接根據(jù)需要保持活動狀態(tài),允許服務(wù)器和客戶端以最小的開銷隨意發(fā)送數(shù)據(jù)。
WebSocket API 是一個(gè)編程接口,用于創(chuàng)建 WebSocket 連接并管理 Web 應(yīng)用程序中客戶端和服務(wù)器之間的數(shù)據(jù)交換。它為開發(fā)人員提供了一種在其應(yīng)用程序中使用 WebSocket 協(xié)議的簡單標(biāo)準(zhǔn)化方法。
如今,幾乎所有現(xiàn)代瀏覽器都支持 WebSocket API。此外,還有大量框架和庫(包括開源和商業(yè)解決方案)實(shí)現(xiàn) WebSocket API。
例如,您可以使用 WebSockets 來:
強(qiáng)大的實(shí)時(shí)聊天體驗(yàn)。
廣播實(shí)時(shí)事件數(shù)據(jù),例如實(shí)時(shí)比分和流量更新。
促進(jìn)共享項(xiàng)目和白板上的多人協(xié)作。
發(fā)送通知和警報(bào)。
使您的后端和前端保持實(shí)時(shí)同步。
將實(shí)時(shí)位置跟蹤功能添加到城市交通和食品配送應(yīng)用程序。
建立 WebSocket 連接的過程稱為開始握手,包括客戶端和服務(wù)器之間的 HTTP 請求/響應(yīng)交換。成功打開握手后,客戶端和服務(wù)器可以通過持久 WebSocket 連接交換消息(幀)。WebSocket 消息可能包含字符串(純文本)或二進(jìn)制數(shù)據(jù)。一旦持久 WebSocket 連接達(dá)到其目的,就可以終止它;客戶端和服務(wù)器都可以通過發(fā)送 close 消息來啟動結(jié)束握手。
WebSocket 優(yōu)勢
WebSockets 保持唯一的連接打開,同時(shí)消除了長輪詢引起的延遲問題。
支持全雙工異步消息傳遞,以便客戶端和服務(wù)器都可以獨(dú)立地將消息流式傳輸?shù)奖舜恕?/p>
WebSockets 通常不使用 ,因此,不會在每個(gè)服務(wù)器請求上發(fā)送標(biāo)頭。這反過來又減小了數(shù)據(jù)有效負(fù)載的大小。XMLHttpRequest
WebSockets 無需任何重新配置即可通過大多數(shù)防火墻,并且具有基于源的安全模型。
WebSocket 的缺點(diǎn)
該文章在 2024/10/19 12:20:47 編輯過