原文地址:http://88250.b3log.org/web-message-pushhtml
消息推送是針對 Web 應用開發領域的技術,指服務端以主動方式將信息送達客戶端。主要用於提高用戶體驗,避免用戶刷新頁面從服務端拉取數據。例如 Web 郵件中自動出現剛收到的郵件項,Web 即時通信自動提示新到消息等應用場景。
要實現消息推送機制,涉及兩方面的內容:前端
可使用套接字接口進行全雙工通信。能夠經過 Flash XMLSocket、Java Applet 技術實現。
但因爲實現方案與廠商技術綁定過緊,不屬於 Web 標準化範疇,而且存在一些限制(通信端口開啓安全、客戶端插件),這裏不進行描述。html5
目前的 Web 應用是基於 HTTP 協議的,其規定了請求-響應的處理模型,位於應用層的單工通信模式使得純粹意義上的服務端推送方式變得難以實現。
爲了基於 HTTP 協議進行「推送」實現,可由客戶端發起 HTTP 請求輪詢,服務端在請求後返回響應。
根據輪詢時間、請求處理方式,分爲如下三種推。java
客戶端通常以定時方式發起請求,服務端處理後返回響應。web
客戶端發起請求後服務端將該請求掛起(不返回響應),直到超時、異常或須要處理響應(推內容)才返回。客戶端收到響應後再次請求(即輪詢)服務端,並處理響應。ajax
客戶端發起請求後服務器端處理請求,並經過 HTTP 流一直向客戶端寫入數據,直到超時或異常才返回響應。鏈接斷開後客戶端再次請求服務端,屬於長輪詢的一種。瀏覽器
這是標準化的客戶端全雙工通信規範,但因爲目前服務端規範還沒有成型,且考慮到現有客戶端對 HTML 5 的支持有限,這裏不進行描述。安全
上述介紹是針對瀏覽器客戶端的,在實際應用場景中,還須要考慮其餘客戶端支持,例如 iOS、Android 等。
在移動客戶端方面,須要考慮以下幾點。服務器
不一樣客戶端本地 APIs 接口存在差別,但都支持基本的 HTTP 協議。直接基於 HTTP 協議進行開發可將差別最小化。websocket
通信信道打開後不必定能長時間維護,客戶端與服務端的狀態管理複雜。
須要儘可能最小化網絡流量,提高移動客戶端可用性。
消息是系統或組件間通信的一種低耦合方式,是系統級異步架構的基礎。
在 Web 消息推送中,服務端管理應用狀態,當狀態發生變遷時須要通知客戶端,完成消息推送。
須要重點關注以下技術點:
Web 層考慮採用開源組件 Pushlets 進行實現。
Pushlets 基於 HTTP 協議的發佈/訂閱模型,提供了 Poll(輪詢)、Pull(拉)兩種推方式實現。其中 Pull 即長輪詢方式,當有消息時就返回。
使用 AJAX 客戶端,較爲靈活,便於封裝。
服務層消息服務採用應用服務器 JMS 中間件。經過發佈/訂閱模型實現狀態同步。
保存推送多的消息記錄,用於客戶端刷新時/多客戶端查找消息。
userId |
createdTime |
lastGetTime |
clients |
msg |
type |
timeout |
targetSys |
srcSys |
…. |
|
xxx |
xxx |
xxx |
[「pc」, 「iOS」] |
{} |
公告 |
3天 |
OA |
OA |
消息體使用 JSON 字符串存放於 msg 字段中。其他字段可根據通用性進行抽取,好比用戶名等。
消息監聽器接收到消息時推 Pushlets,並進行記錄寫入(記錄 lastGetTime 爲寫入時間,表示這條消息已經推送過)。
設置定時任務對超時記錄進行刪除。
JMS 消息系統爲單獨的通信總線服務獨立於應用系統,Pushlets 爲應用系統中的一個組件。
消息表管理組件提供消息新增,以及對推送過的消息記錄的查詢、刪除。