web端實現消息實時性有哪些方式

短輪詢:

基於http協議,客戶端每隔一定時間與服務端建立http連接,無新消息就返回,有消息就把數據帶回來。

優點:好理解,實現簡單

缺點:隔的時間不好定,太長會影響實時性,太短就會對服務器壓力大,浪費資源

長輪詢:

同樣也基於http協議,與短輪詢不同的地方在於如果沒有消息不是立刻就返回,反而會在服務端被hold住,直到超時(由服務端設置)或者有對應的消息產生。

實現原理:通常的做法是,在服務器的程序中加入一個死循環,在循環中監測數據的變動。當發現新數據時,立即將其輸出給瀏覽器並斷開連接,瀏覽器在收到數據後,再次發起請求以進入下一個週期,這就是常說的長輪詢(long-polling)方式

優點:減少了兩端的http通信

缺點:長輪詢和短輪詢比起來,明顯減少了很多不必要的http請求次數,相比之下節約了資源。長輪詢的缺點在於,連接掛起也會導致資源的浪費。因爲長時間不釋放連接更加考驗服務端的併發量

長連接SSE:

SSE是HTML5新增的功能,全稱Server-Sent Events。它可以允許服務推送數據到客戶端。SSE在本質上就與之前的長輪詢,短輪詢不同,雖然都是基於http協議的,但是輪詢需要客戶端先發送請求。而SSE最大的特點就是不需要客戶端發送請求,可以實現只要服務端數據有更新,就可以馬上發送到客戶端。

原理:嚴格來說,http協議是沒有辦法做服務器推送的,但是當服務器向客戶端聲明接下來要發送流信息時,客戶端連接就會保持連接打開,SSE使用的就是這種原理。

優點:不需要建立或者保持大量的客戶端發往服務器端的請求,節約了很多資源,提升應用性能並且SSE的實現非常簡單,並且不需要依賴其他插件。

WebSocket:

websocket是HTML5定義的一個新協議,與傳統的http協議不同,該協議可以實現服務器與客戶端之間全雙工通信。簡單來說,首先需要在客戶端和服務器端建立起一個連接,這部分需要http。連接一旦建立,客戶端和服務端就處於平等的地位,可以相互發送數據,不存在請求和響應的區別。

優點:實現了雙向通信

缺點:服務器端的邏輯非常複雜。現在針對不同的後臺語言有不同的插件可以使用。

 

SSE與websocket比較:

1.SSE是單向通道,只能服務器向客戶端發送消息,如果客戶端需要向服務器發送消息,則需要一個新的http請求,這對比websocket的雙工通道來說,會有更大的開銷。這麼一來的話就會存在一個什麼時候才需要關心這個差異的問題,如果平均每秒會向服務器發送一次消息的話,那應該選擇websocket。如果一分鐘僅5-6次的話,其實這個差異不大

2.在瀏覽器兼容方面,兩者差不多。在較早之前,每當需要建立雙向socket時就會使用Flash,在移動瀏覽器不支持Flash的情況下,websocket的兼容是比較難做的。

3.SSE實現便利,實現一個完整的服務僅需要少量的代碼,不需要啓動一個新的服務,可以用任何一種服務端語言實現。

4.SSE基於http/https協議,可以直接運行於現有的代理服務器和認證技術

 

總結:  

從兼容性角度考慮,短輪詢>長輪詢>長連接SSE>WebSocket;

從性能方面考慮,WebSocket>長連接SSE>長輪詢>短輪詢。

另外:Http2.0也支持服務端主動推送

 

參考文章:

https://www.cnblogs.com/huchong/p/8595644.html

https://www.cnblogs.com/goloving/p/9196066.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章