1. 程式人生 > >伺服器推送技術

伺服器推送技術

什麼是伺服器推送技術

推送技術是指通過客戶端與伺服器端建立長連結,客戶端可以接收由伺服器端不定時傳送的訊息。

解決方案

1.Ajax短輪詢

2.Ajax長輪詢

3.WebSocket

短輪詢

Ajax短輪詢:http 短輪詢是 server 收到請求不管是否有資料到達都直接響應http請求;如果瀏覽器收到的資料為空,則隔一段時間,瀏覽器又會發送相同的http請求到server 以獲取資料響應,就是用一個定時器不停的去網站上請求資料。

		缺點:訊息互動的實時性較低(server端到瀏覽器端的資料反饋效率低)。

長輪詢

http 長輪詢是server 收到請求後如果有資料,立刻響應請求;如果沒有資料 就會 停留 一段時間,這段時間內,如果 server 請求的資料到達(如查詢資料庫或資料的邏輯處理完成),就會立刻響應;如果這段時間過後,還沒有資料到達,則以空資料的形式響應http請求;若瀏覽器收到的資料為空,會再次傳送同樣的http請求到server。

AJAX的長輪詢

1,DeferredResult:Springmvc的控制層接收使用者的請求之後,採用非同步處理,立即返回DeferedResult泛型物件,此時驅動控制層的容器主執行緒,可以處理更多的請求。
2,Servlet3:也是非同步處理。

				缺點:server 沒有資料到達時,http連線會停留一段時間,這會造成伺服器資源浪費;

SSE

嚴格地說,HTTP 協議無法做到伺服器主動推送資訊。但是,有一種變通方法,就是伺服器向客戶端宣告,接下來要傳送的是流資訊(streaming)。
也就是說,傳送的不是一次性的資料包,而是一個數據流,會連續不斷地傳送過來。這時,客戶端不會關閉連線,會一直等著伺服器發過來的新的資料流,視訊播放就是這樣的例子。本質上,這種通訊就是以流資訊的方式,完成一次用時很長的下載。
SSE 就是利用這種機制,使用流資訊向瀏覽器推送資訊。它基於 HTTP 協議,目前除了 IE/Edge,其他瀏覽器都支援。
SSE 與 WebSocket 作用相似,都是建立瀏覽器與伺服器之間的通訊渠道,然後伺服器向瀏覽器推送資訊。

總體來說,WebSocket 更強大和靈活。因為它是全雙工通道,可以雙向通訊;SSE是單向通道,只能伺服器向瀏覽器傳送,因為流資訊本質上就是下載。如果瀏覽器向伺服器傳送資訊,就變成了另一次 HTTP 請求。

				SSE 也有自己的優點:
					SSE 使用 HTTP 協議,現有的伺服器軟體都支援。WebSocket 是一個獨立協議。
					SSE 屬於輕量級,使用簡單;WebSocket 協議相對複雜。
					SSE 預設支援斷線重連,WebSocket 需要自己實現。
					SSE 一般只用來傳送文字,二進位制資料需要編碼後傳送,WebSocket 預設支援傳送二進位制資料。
					SSE 支援自定義傳送的訊息型別。
					SSE 也是長連線	

http長輪詢和短輪詢的異同

1)相同點:當server 的資料不可達時,基於http長輪詢和短輪詢 的http請求,都會 停留一段時間;
2)不同點:http長輪詢是在伺服器端的停留,而http 短輪詢是在 瀏覽器端的停留;
3)效能總結:從這裡可以看出,不管是長輪詢還是短輪詢,都不太適用於客戶端數量太多的情況,因為每個伺服器所能承載的TCP連線數是有上限的,這種輪詢很容易把連線數頂滿;

WebSocket通訊

什麼是WebSocket

WebSocket 是 html5 規範釋出的新協議,和 http協議完全是兩個不同的概念,或者說基本沒關係;WebSocket協議和http協議的唯一聯絡點在於,WebSocket協議為了相容現有瀏覽器的握手規範而採用了http協議中的握手規範以建立WebSocket連線,其客戶端與伺服器建立的是 持久連線。

		WebSocket 解決了 HTTP 的幾個難題:
			1(http協議的被動性):採用 WebSocket 協議後,伺服器可以主動推送訊息給客戶端;而不需要客戶端以(長/短)輪詢的方式發起http請求到server以獲取資料更新反饋;這樣一來,客戶端只需要經過一次HTTP請求,就可以做到源源不斷的資訊傳送了(在程式設計中,這種設計叫做回撥,即:server端有資訊了再來通知client端,而不是client端每次都傻乎乎地跑去輪詢server端 是否有訊息更新);
			2(http協議的無狀態性/健忘性):短輪詢是每次http請求前都要建立連線,而長輪詢是相鄰幾次請求前都要建立連線;http請求響應完成後,伺服器就會斷開連線,且把連線的資訊全都忘記了;所以每次建立連線都要重新傳輸連線上下文(下面有補充),將 client 端的連線上下文來告訴server端;而WebSockct只需要一次HTTP握手,整個通訊過程是建立在一次連線(狀態)中的,server端會一直推送訊息更新反饋到客戶端,直到客戶端關閉請求,這樣就無需客戶端為傳送訊息而建立不必要的 tcp 連線 和 為了建立tcp連線而傳送不必要的冗餘的連線上下文訊息;

		特點:
			1,HTML5中的協議,實現與客戶端與伺服器雙向,基於訊息的文字或二進位制資料通訊
			2,適合於對資料的實時性要求比較強的場景,如通訊、直播、共享桌面,特別適合於客戶與服務頻繁互動的情況下,如實			時共享、多人協作等平臺。
			3,採用新的協議,後端需要單獨實現
			4,客戶端並不是所有瀏覽器都支援

實現

1,HTML5規範中的WebSocket API

2,WebSocket的子協議STOMP。

				STOMP(Simple Text Oriented Messaging Protocol):
					1,簡單(流)文字定向訊息協議
					2,STOMP協議的前身是TTMP協議(一個簡單的基於文字的協議),專為訊息中介軟體設計。是屬於訊息佇列的一種協議, 和AMQP,JMS平級.它的簡單性恰巧可以用於定義websocket的訊息體格式.STOMP協議很多MQ都已支援,比如RabbitMq, ActiveMq。
					3,生產者(傳送訊息)、訊息代理、消費者(訂閱然後收到訊息)
					4,STOMP是基於幀的協議

SSE和WebSocket相比的優勢

1,最大的優勢就是便利:不需要新增任何新元件,用任何你習慣的後端語言和框架就能繼續使用。你不用為新建虛擬機器、弄一個新的IP或新的埠號而勞神,就像在現有網站中新增一個頁面那樣簡單。可以稱為既存基礎設施優勢。

2,SSE的第二個優勢是服務端的簡潔。相對而言,WebSocket則很複雜,不借助輔助類庫基本搞不定。WebSocket能做的,SSE也能做,反之亦然,但在完成某些任務方面,它們各有千秋。WebSocket是一種更為複雜的服務端實現技術,但它是真正的雙向傳輸技術,既能從服務端向客戶端推送資料,也能從客戶端向服務端推送資料。

總結

技術沒有優劣之分,只有場景是否合適,在京東的支付完成之後的跳轉的推送技術中,也是用的ajax段輪訓的方式,原因是要用有限的資源來為千萬級甚至上億的使用者提供服務,如果是用長連線,對於接入的伺服器,比如說Nginx,是很大的壓力,光是為使用者維持這個長連線都需要成百上千的Nginx的伺服器,這是很划不來的。因為對於京東這類購物網站來說,使用者的瀏覽查詢量是遠遠大於使用者下單量的,京東需要注重的是服務更多的使用者,而且相對於使用者瀏覽頁面的圖片等等的流量而言,這點頻寬浪費佔比是很小的。所以我們看京東的付款後的實現,是用的短輪詢機制,而且時長放大到了5秒。