一、背景
消息推送是針對 Web 應用開發領域的技術,指服務端以主動方式將信息送達客戶端。主要用於提升用戶體驗,避免用戶刷新頁面從服務端拉取數據。例如 Web 郵件中自動出現剛收到的郵件項,Web 即時通訊自動提示新到消息等應用場景。
1.1、多客戶端支持
在實際應用場景中,客戶端可能是瀏覽器或者 iOS、Android 等。在移動客戶端方面,需要考慮如下幾點。
APIs 多樣
不同客戶端本地 APIs 接口存在差異,但都支持基本的 HTTP 協議。直接基於 HTTP 協議進行開發可將差異最小化。
網絡連接不穩定
通訊信道打開后不一定能長時間維護,客戶端與服務端的狀態管理復雜。
最小化流量
需要盡量最小化網絡流量,提升移動客戶端可用性。
1.2、Comet
Comet 基於 HTTP長連接的“服務器推”技術,是一種新的 Web 應用架構。基於這種架構開發的應用中,服務器端會主動以異步的方式向客戶端程序推送數據,而不需要客戶端顯式的發出請求。Comet 架構非常適合事件驅動的 Web 應用,以及對交互性和實時性要求很強的應用,如股票交易行情分析、聊天室和 Web 版在線游戲等。
二、Web 層消息推送
2.1、套接字
可以使用套接字接口進行全雙工通訊。可以通過 Flash XMLSocket、Java Applet 技術實現。
但由於實現方案與廠商技術綁定過緊,不屬於 Web 標准化范疇,並且存在一些限制(通訊端口開啟安全、客戶端插件),這里不進行描述。
2.2、HTTP 請求輪詢
目前的 Web 應用是基於 HTTP 協議的,其規定了請求-響應的處理模型,位於應用層的單工通訊模式使得純粹意義上的服務端推送方式變得難以實現。
為了基於 HTTP 協議進行“推送”實現,可由客戶端發起 HTTP 請求輪詢,服務端在請求后返回響應。
根據輪詢時間、請求處理方式,分為以下三種推。
2.3、簡單輪詢
客戶端一般以定時方式發起請求,服務端處理后返回響應。
- 原理、客戶端/服務端實現簡單
- 可根據應用場景調整輪詢時間間隔
- 服務端需要處理大量請求
2.4、長輪詢
客戶端發起請求后服務端將該請求掛起(不返回響應),直到超時、異常或需要處理響應(推內容)才返回。客戶端收到響應后再次請求(即輪詢)服務端,並處理響應。
- 實時性高
- 服務端需要管理掛起請求
2.5、HTTP 流
客戶端發起請求后服務器端處理請求,並通過 HTTP 流一直向客戶端寫入數據,直到超時或異常才返回響應。連接斷開后客戶端再次請求服務端,屬於長輪詢的一種。
2.6、HTML 5 WebSocket
這是標准化的客戶端全雙工通訊規范,但由於目前服務端規范尚未成型,且考慮到現有客戶端對 HTML 5 的支持有限,這里不進行描述。