資料互動有兩種模式:push(推模式)、pull(拉模式)。
1 推模式指的是客戶端與服務端建立好網路長連線,服務方有相關資料,直接通過長連線通道推送到客戶端。
<1>優點:及時,一旦有資料變更,客戶端立馬能感知到;另外對客戶端來說邏輯簡單,不需要關心有無資料這些邏輯處理。
<2>缺點:不知道客戶端的資料消費能力,可能導致資料積壓在客戶端,來不及處理。
2 拉模式指的是客戶端主動向服務端發出請求,拉取相關資料。
<1>優點:此過程由客戶端發起請求,故不存在推模式中資料積壓的問題。
<2>缺點:可能不夠及時,對客戶端來說需要考慮資料拉取相關邏輯,何時去拉,拉的頻率怎麼控制等等。
輪詢和長輪詢
兩種均為pull拉模式
1 polling《輪詢》:不管服務端資料有無更新,客戶端每隔定長時間請求拉取一次資料,可能有更新資料返回,也可能什麼都沒有。
2 long polling《長輪詢》:客戶端發起long polling,此時如果服務端沒有相關資料,會hold住請求,直到服務端有相關資料,或者等待一定時間超時才會返回。返回後,客戶端又會立即再次發起下一次long polling。(所謂的hold住請求指的服務端暫時不回覆結果,儲存相關請求,不關閉請求連線,等相關資料準備好,寫會客戶端。)
3 前面提到long polling如果當時服務端沒有需要的相關資料,此時請求會hold住,直到服務端把相關資料準備好,或者等待一定時間直到此次請求超時,這裡大家是否有疑問,為什麼不是一直等待到服務端資料準備好再返回,這樣也不需要再次發起下一次的long polling,節省資源?
主要原因是網路傳輸層主要走的是tcp協議,tcp協議是可靠面向連線的協議,通過三次握手建立連線。但是所建立的連線是虛擬的,可能存在某段時間網路不通,或者服務端程式非正常關閉,亦或服務端機器非正常關機,面對這些情況客戶端根本不知道服務端此時已經不能互通,還在傻傻的等服務端發資料過來,而這一等一般都是很長時間。當然tcp協議棧在實現上有保活計時器來保證的,但是等到保活計時器發現連線已經斷開需要很長時間,如果沒有專門配置過相關的tcp引數,一般需要2個小時,而且這些引數是機器作業系統層面,所以,以此方式來保活不太靠譜,故long polling的實現上一般是需要設定超時時間的。
如何進行長輪詢
1 發起polling
發起polling很簡單,只需向伺服器發起請求,此時服務端還未應答,所以客戶端與服務端之間一直處於連線狀態
2 資料推送
如果伺服器端有相關資料,此時服務端會將資料通過此前建立的通道發回客戶端。
3 polling終止
polling終止情況有三種:
若服務端返回相關資料,此時客戶端收到資料後,關閉請求連線,結束此次polling過程。
若客戶端等待設定的超時時間後,服務端依然沒有返回資料,此時客戶端需要主動終止此次polling請求。
若客戶端收到網路故障或異常,此時客戶端自然也是需要主動終止此次polling請求。
4 重新polling
終止上次polling後,客戶端需要立即再次發起polling請求。這樣才能保證拉取資料的及時性。
**
輪詢與長輪詢
輪詢即輪番詢問 讓瀏覽器定時 例如每隔5s中傳送一次 通過ajax偷偷滴朝服務端傳送請求獲取資料 不足之處 訊息延遲 請求次數過多 損耗資源嚴重 效率低 基本不用 優點 在無訊息的情況下不會頻繁的請求,耗費資源小。缺點 伺服器hold連線會消耗資源,返回資料順序無保證,難於管理維護。長輪詢實現聊天室...
輪詢 長輪詢
輪詢 通過setinterval向後台請求資料,更新html from flask import flask,render template,request,jsonify users 2 3 user list defuser list import time return render temp...
輪詢,長輪詢,Websocket
原理 利用ajax定時朝後端傳送請求,比如每隔五秒鐘發一次請求,那麼你的資料延遲就可能會高達五秒 特點 資料延遲,消耗資源過大,請求次數太多 原理 利用ajax 佇列 定時朝後端傳送請求,如果沒有資料則會阻塞但是不會一直阻塞,比如阻塞你30秒,還沒有資料則返回,然後讓客戶端瀏覽器再次傳送請求資料的請...