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