咱們研發的平臺已經完成了支持PC端和移動端的針對大量用戶的實時消息推送體系,採用原生的socket創建長鏈接的技術來實現。當前階段要開發相應支持web端的實時消息推送體系,如何實現擺在了個人面前,如下是我考察和論證的結果,和你們一塊兒分享下,也歡迎你們指正我其中的錯誤或考慮不周之處。javascript
咱們瞭解到傳統的web服務都是客戶端發出請求,服務端給出響應。可是如今直觀的要求是容許特定時間內在沒有客戶端發起請求的狀況下服務端主動推送消息到客戶端。php
不斷地輪詢(俗稱「拉」)一般是咱們考慮獲取實時消息的一個手段:最多見的例子你們應該不陌生,咱買火車票用的搶票軟件,就是輪詢啊,輪詢啊...(話說我如今正搶票呢,亞歷山大。後話:沒搶上) *html
優勢:服務端邏輯簡單;java
缺點:其中大多數請求多是無效請求,在大量用戶輪詢很頻繁的狀況下對服務器的壓力很大;python
應用:併發用戶量少,並且要求消息的實時性不高;web
長輪詢技術:客戶端向服務器發送Ajax請求,服務器接到請求後hold住鏈接,直到有新消息或超時(設置)才返回響應信息並關閉鏈接,客戶端處理完響應信息後再向服務器發送新的請求...瀏覽器
優勢:實時性高,無消息的狀況下不會進行頻繁的請求;服務器
缺點:服務器維持着鏈接期間會消耗資源;網絡
應用:WebQQ、知乎,Quora...併發
基於Iframe及htmlfile的流(streaming)方式:iframe流方式是在頁面中插入一個隱藏的iframe,利用其src屬性在服務器和客戶端之間建立一條長連接,服務器向iframe傳輸數據(一般是HTML,內有負責插入信息的javascript),來實時更新頁面。
優勢:消息可以實時到達;
缺點:服務器維持着長鏈接期會消耗資源;
應用:gmail+gtalk 產品;
插件提供socket方式:好比利用Flash XMLSocket,Java Applet套接口,Activex包裝的socket。
優勢:原生socket的支持,和最前面我說的PC端和移動端的實現方式類似;
缺點:瀏覽器端須要裝相應的插件;
應用:在一些網絡遊戲中不少見;
WebSocket:是HTML5開始提供的一種瀏覽器與服務器間進行全雙工通信的網絡技術。
優勢:更好的節省服務器資源和帶寬並達到實時通信;
缺點:目前還未普及,瀏覽器支持很差;
應用:我不清楚,哈哈;
鑑於本身印象裏一直對web端推送中的Comet有些瞭解,上述的基於長輪詢和基於iframe流的方式都是Comet的具體實現。其中使用也最爲普遍,因此決定採用Comet技術來實現web推送。
固然,不至於本身造個輪子,因此決定選擇現有的基於Comet技術的web框架來進行開發。你們能夠經過wiki Comet 詳細瞭解下Comet的歷史及相關框架。其中有基於java的,基於php的,由於我常常使用Python寫測試維護腳本並且發現python的框架很簡潔,因此我初步選擇的是用基於python的Tornado框架結合Comet技術來實現web的推送體系。