1. 輪詢
由客戶端發(fā)送請求,服務(wù)器接收請求的過程,通過客戶端不斷請求,使得客戶端能夠模擬達(dá)到類似實(shí)時收到服務(wù)器的效果??蛻舳硕〞r向服務(wù)器發(fā)送Ajax請求,服務(wù)器接到請求后馬上返回響應(yīng)信息,并關(guān)閉連接。
不管服務(wù)端數(shù)據(jù)有無更新,客戶端每隔定長時間請求拉取一次數(shù)據(jù),可能有更新數(shù)據(jù)返回,也可能什么都沒有。
適用用戶量比較小,不太注重性能的項(xiàng)目,如小型應(yīng)用、WEB應(yīng)用、例如系統(tǒng)消息、天氣展示等。
優(yōu)點(diǎn):邏輯簡單,易于理解,開發(fā)快速。
缺點(diǎn):
(1)需要重復(fù)建立HTTP連接,占用大量客戶端和服務(wù)端的連接
資源。
(2)客戶端越多, 服務(wù)端壓力越大,很多時候并沒有新的數(shù)據(jù)更新,因此絕大部分請求都是無效請求。
(3)數(shù)據(jù)不一定是實(shí)時更新,要看設(shè)定的請求間隔,基本會有延遲。
2. 長輪詢
長輪詢是長連接的一種,當(dāng)服務(wù)器收到客戶端發(fā)來的請求后,服務(wù)器端不會直接進(jìn)行響應(yīng),而是先將這個請求掛起,然后判斷服務(wù)器端數(shù)據(jù)是否有更新。如果有更新,則進(jìn)行響應(yīng),如果一直沒有數(shù)據(jù),則會 hold 住請求,直到服務(wù)端的數(shù)據(jù)發(fā)生變化,或者等待一定時間超時才會返回。
客戶端JavaScript響應(yīng)處理函數(shù)會在處理完服務(wù)器返回的信息后,再次發(fā)出請求,重新建立連接。像WebQQ/FaceBook早起都是使用長輪詢實(shí)現(xiàn)的。
優(yōu)點(diǎn):消息即時到達(dá),和短輪詢比起來,明顯減少了很多不必要的HTTP請求次數(shù),在無消息的情況下不會頻繁的請求,相比之下節(jié)約了資源,在無消息的情況下不會頻繁的請求。
缺點(diǎn):連接掛起會導(dǎo)致資源的浪費(fèi),長輪詢會造出非常多的請求,不斷的請求可能會造成的影響是數(shù)據(jù)順序無法得到保證。
3. 建議
輪訓(xùn)能夠?qū)崿F(xiàn)的功能長輪訓(xùn)都能滿足,從技術(shù)角度考慮建議使用長輪訓(xùn)替換輪訓(xùn)實(shí)現(xiàn), 節(jié)省服務(wù)器性能和帶寬, 相比下來開發(fā)成本也不高。