輪詢與長輪詢

2022-06-19 10:06:12 字數 1514 閱讀 6090

資料互動有兩種模式: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秒,還沒有資料則返回,然後讓客戶端瀏覽器再次傳送請求資料的請...