輪詢(xún)、長(zhǎng)輪詢(xún)、server-sent-event

1.png

輪詢(xún)

客戶(hù)端定時(shí)向服務(wù)器發(fā)送Ajax請(qǐng)求,服務(wù)器接到請(qǐng)求后無(wú)論是否有響應(yīng)的數(shù)據(jù),都馬上返回響應(yīng)信息并關(guān)閉連接。

優(yōu)點(diǎn):實(shí)現(xiàn)簡(jiǎn)單。

缺點(diǎn):浪費(fèi)帶寬和服務(wù)器資源,新數(shù)據(jù)響應(yīng)會(huì)有延遲。

應(yīng)用:小應(yīng)用小場(chǎng)景。

長(zhǎng)輪詢(xún)

與簡(jiǎn)單輪詢(xún)相似,只是在服務(wù)端在沒(méi)有新的返回?cái)?shù)據(jù)情況下不會(huì)立即響應(yīng),而會(huì)掛起,直到有數(shù)據(jù)或即將超時(shí)。

優(yōu)點(diǎn):實(shí)現(xiàn)也不復(fù)雜,同時(shí)相對(duì)輪詢(xún),節(jié)約帶寬。

缺點(diǎn):所以還是存在占用服務(wù)端資源的問(wèn)題,雖然及時(shí)性比輪詢(xún)要高,但是會(huì)在沒(méi)有數(shù)據(jù)的時(shí)候在服務(wù)端掛起,所以會(huì)一直占用服務(wù)端資源,處理能力變少。

應(yīng)用:一些早期的對(duì)及時(shí)性有一些要求的應(yīng)用:web IM 聊天。

SSE(Server Send Event)服務(wù)器推送

一個(gè)客戶(hù)端獲取新的數(shù)據(jù)通常需要發(fā)送一個(gè)請(qǐng)求到服務(wù)器,也就是向服務(wù)器請(qǐng)求的數(shù)據(jù)。使用 server-sent 事件,服務(wù)器可以在任何時(shí)刻向我們的客戶(hù)端推送數(shù)據(jù)和信息。這些被推送進(jìn)來(lái)的信息可以在這個(gè)客戶(hù)端上作為 Events + data 的形式來(lái)處理。

客戶(hù)端

EventSource 類(lèi)

使用 EventSource 類(lèi)接口來(lái)完成請(qǐng)求。

// /getData 為某個(gè)獲取數(shù)據(jù)的url
let source = new EventSource("/getData");

參考:https://developer.mozilla.org/en-US/docs/Web/API/EventSource

服務(wù)端

服務(wù)端需要做如下一些設(shè)置:

頭信息

"Content-type": "text/event-stream"

返回?cái)?shù)據(jù)格式

https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events/Using_server-sent_events

ctx.body = `event: ping\ndata: {"time": "${new Date()}"}\n\n`
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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