天天看點

長輪詢解決方案長輪詢解決方案

版權聲明:本文為部落客chszs的原創文章,未經部落客允許不得轉載。 https://blog.csdn.net/chszs/article/details/46581179

長輪詢解決方案

作者:chszs,轉載需注明。部落格首頁: http://blog.csdn.net/chszs

長輪詢适合浏覽器的Chat聊天、股票行情顯示、股票狀态更新、體育直播的結果顯示等。當然,不是所有的例子都是對延遲很敏感的,但它們的需求都比較相似。

在标準的HTTP請求響應語義中,浏覽器發起請求,伺服器發送一個響應,這意味着在浏覽器發起新請求前,伺服器不能發送新資訊給用戶端浏覽器。有幾種解決方法,包括:傳統的輪詢、長輪詢、HTTP流、WebSocket協定等。

1、傳統的輪詢

浏覽器保持發送請求,檢查伺服器是否有新資訊傳回,伺服器對于每次請求均應立即響應。這适合的場景下,輪詢可以設定為合理的時間間隔。例如,郵件用戶端可以每隔10分鐘檢查伺服器是否有新郵件。傳統的輪詢的優點是簡單且工作可靠。然而,其缺點是效率不高。如果需要盡快獲得新資訊,那麼輪詢頻率就必須非常高。

2、長輪詢

浏覽器不斷發送請求,但是伺服器不予以響應,一直到伺服器有了新資訊才響應用戶端。從用戶端的角度看它和傳統的輪詢相同。但從伺服器端的角度來看它與傳統的輪詢相比,減少了伺服器端的開銷。

那麼響應應該保持Open多久呢?浏覽器通常對此時間的設定是5分鐘,而網絡中介(比如代理)對此時間設定的更短。是以,即使伺服器端沒有新消息,用戶端也應該定期發起一個新長輪詢請求。IEFT檔案建議這個時間間隔在30秒~120秒之間,而實際使用取決于你的網絡情況。

IEFT檔案:

http://tools.ietf.org/html/rfc6202

長輪詢可以極大地減少需要低延遲的接收資訊更新請求的數量,特别是新資訊在無規律的時間間隔變得可用時。但是,如果資訊更新的越頻繁,那麼整個方案就越像傳統的輪詢。

3、HTTP流

浏覽器向伺服器送出請求,伺服器要發送資訊時就會響應。但是它與長輪詢不同,伺服器需保持響應是Open的,有更新時就會響應用戶端。該方法去除了輪詢的需要,而且偏離了典型的HTTP請求/響應的語義。例如,用戶端和伺服器需要協商如何解釋響應流,這樣用戶端會知道哪一個更新資訊結束了,哪一個更新資訊開始了。但是,網絡中介可以緩存響應流,阻撓此方法的意圖。這就是為什麼長輪詢更為常用。

4、WebSocket協定

浏覽器發送一個HTTP請求到伺服器,請求切換到WebSocket協定,伺服器響應,确認更新協定到WebSocket。此後,浏覽器和伺服器可以在TCP套接字上雙向發送資料幀。

WebSocket協定被設計用于取代需要輪詢,特别是适用于需要在伺服器和浏覽器之間頻繁交換資料的場景。在HTTP協定上完成初始握手,以確定WebSocket請求可以穿透防火牆。

WebSockets雙向交換的資料有兩種類型,文本資訊或二進制資訊。這使得它與RESTful HTTP方法有顯著不同。事實上,還有一些其它協定,比如XMPP,AMQP,STOMP等,目前仍在廣泛使用。

WebSocket協定已經被IETF組織進行了标準化,而WebSocket API規範也由W3C标準完成了制訂。在Java領域也制訂了JSR-356規範以支援WebSocket協定。像Jetty、Tomcat這樣的Servlet容器也實作了對WebSocket協定的支援。

5、長連接配接(Persistent Connection)

HTTP Persistent Connection,即HTTP長連接配接,也叫HTTP Keep-alive或HTTP Connection Reuse。其思想是使用單個的TCP連接配接來發送和接收多個HTTP請求/響應,而不是為每個請求/響應都建立一個新連接配接。新釋出的HTTP /2協定就使用了這種思想,并進一步允許在單個連接配接上多路複用多個并發的請求/響應。

而早期的長連接配接技術隻是要求在用戶端與伺服器之間建立和保持穩定可靠的連接配接。早期由于浏覽器技術發展較緩慢,沒有為這種機制的實作提供很好的支援。早期通常的做法是在頁面裡嵌入一個隐蔵iframe,将這個隐蔵iframe的src屬性設為對一個長連接配接的請求或是采用xhr請求,伺服器端就能源源不斷地往用戶端輸入資料。

6、Pushlet

在這種技術中,伺服器端利用了HTTP長連接配接的優點,使得響應總是Open的,即伺服器不會終止響應,有效地讓浏覽器可以在初始頁面加載後繼續加載其它内容。随後伺服器端可以周期性的發送JavaScript代碼片段來更新頁面的内容,進而達到推動能力。通過使用這種技術,用戶端不需要Java Applet或其它插件才能保持與伺服器的連接配接Open;用戶端會對伺服器推送的新事件自動通知。其缺點是伺服器端缺少對浏覽器端的逾時控制,如果浏覽器發生逾時,必須使用頁面重新整理。

Pushlets的官方站點:

http://www.pushlets.com/

Pushlet從2000年發展到2010年,逐漸淡出市場。

7、Comet

Comet是一個Web應用模型,它使用一個HTTP長連接配接,允許伺服器推送資料到浏覽器,無需浏覽器顯式的發起請求。Comet技術是這種技術方式的統稱,實際上有多種具體的實作技術,下面以具體的時間軸介紹Comet技術有哪些。

1)早期的Java Applet

2)2000年興起的Pushlets架構

3)Hidden iframe

4)XMLHttpRequest

5)XMLHttpRequest的長輪詢

6)腳本标簽長輪詢