消息推送是針對 Web 應用開發領域的技術,指服務端以主動方式將信息送達客戶端。主要用於提高用戶體驗,避免用戶刷新頁面從服務端拉取數據。例如 Web 郵件中自動出現剛收到的郵件項,Web 即時通信自動提示新到消息等應用場景。html
在實際應用場景中,客戶端多是瀏覽器或者 iOS、Android 等。在移動客戶端方面,須要考慮以下幾點。html5
APIs 多樣
不一樣客戶端本地 APIs 接口存在差別,但都支持基本的 HTTP 協議。直接基於 HTTP 協議進行開發可將差別最小化。
網絡鏈接不穩定
通信信道打開後不必定能長時間維護,客戶端與服務端的狀態管理複雜。
最小化流量
須要儘可能最小化網絡流量,提高移動客戶端可用性。nginx
Comet 基於 HTTP長鏈接的「服務器推」技術,是一種新的 Web 應用架構。基於這種架構開發的應用中,服務器端會主動以異步的方式向客戶端程序推送數據,而不須要客戶端顯式的發出請求。Comet 架構很是適合事件驅動的 Web 應用,以及對交互性和實時性要求很強的應用,如股票交易行情分析、聊天室和 Web 版在線遊戲等。web
可使用套接字接口進行全雙工通信。能夠經過 Flash XMLSocket、Java Applet 技術實現。
但因爲實現方案與廠商技術綁定過緊,不屬於 Web 標準化範疇,而且存在一些限制(通信端口開啓安全、客戶端插件),這裏不進行描述。瀏覽器
目前的 Web 應用是基於 HTTP 協議的,其規定了請求-響應的處理模型,位於應用層的單工通信模式使得純粹意義上的服務端推送方式變得難以實現。
爲了基於 HTTP 協議進行「推送」實現,可由客戶端發起 HTTP 請求輪詢,服務端在請求後返回響應。
根據輪詢時間、請求處理方式,分爲如下三種推。安全
客戶端通常以定時方式發起請求,服務端處理後返回響應。服務器
客戶端發起請求後服務端將該請求掛起(不返回響應),直到超時、異常或須要處理響應(推內容)才返回。客戶端收到響應後再次請求(即輪詢)服務端,並處理響應。websocket
客戶端發起請求後服務器端處理請求,並經過 HTTP 流一直向客戶端寫入數據,直到超時或異常才返回響應。鏈接斷開後客戶端再次請求服務端,屬於長輪詢的一種。網絡
這是標準化的客戶端全雙工通信規範,但因爲目前服務端規範還沒有成型,且考慮到現有客戶端對 HTML 5 的支持有限,這裏不進行描述。架構