消息推送技术
原文地址:http://88250.b3log.org/web-message-push
消息推送技術
消息推送
消息推送是針對 Web 應用開發領域的技術,指服務端以主動方式將信息送達客戶端。主要用于提升用戶體驗,避免用戶刷新頁面從服務端拉取數據。例如 Web 郵件中自動出現剛收到的郵件項,Web 即時通訊自動提示新到消息等應用場景。
要實現消息推送機制,涉及兩方面的內容:
- Web 層消息推送
- 服務層消息服務
Web 層消息推送
套接字
可以使用套接字接口進行全雙工通訊??梢酝ㄟ^ Flash XMLSocket、Java Applet 技術實現。
但由于實現方案與廠商技術綁定過緊,不屬于 Web 標準化范疇,并且存在一些限制(通訊端口開啟安全、客戶端插件),這里不進行描述。
HTTP 請求輪詢
目前的 Web 應用是基于 HTTP 協議的,其規定了請求-響應的處理模型,位于應用層的單工通訊模式使得純粹意義上的服務端推送方式變得難以實現。
為了基于 HTTP 協議進行“推送”實現,可由客戶端發起 HTTP 請求輪詢,服務端在請求后返回響應。
根據輪詢時間、請求處理方式,分為以下三種推。
簡單輪詢
客戶端一般以定時方式發起請求,服務端處理后返回響應。
- 原理、客戶端/服務端實現簡單
- 可根據應用場景調整輪詢時間間隔
- 服務端需要處理大量請求
長輪詢
客戶端發起請求后服務端將該請求掛起(不返回響應),直到超時、異?;蛐枰幚眄憫?#xff08;推內容)才返回??蛻舳耸盏巾憫笤俅握埱?#xff08;即輪詢)服務端,并處理響應。
- 實時性高
- 服務端需要管理掛起請求
HTTP 流
客戶端發起請求后服務器端處理請求,并通過 HTTP 流一直向客戶端寫入數據,直到超時或異常才返回響應。連接斷開后客戶端再次請求服務端,屬于長輪詢的一種。
HTML 5 WebSocket
這是標準化的客戶端全雙工通訊規范,但由于目前服務端規范尚未成型,且考慮到現有客戶端對 HTML 5 的支持有限,這里不進行描述。
多客戶端支持
上述介紹是針對瀏覽器客戶端的,在實際應用場景中,還需要考慮其他客戶端支持,例如 iOS、Android 等。
在移動客戶端方面,需要考慮如下幾點。
APIs 多樣
不同客戶端本地 APIs 接口存在差異,但都支持基本的 HTTP 協議。直接基于 HTTP 協議進行開發可將差異最小化。
網絡連接不穩定
通訊信道打開后不一定能長時間維護,客戶端與服務端的狀態管理復雜。
最小化流量
需要盡量最小化網絡流量,提升移動客戶端可用性。
服務層消息服務
消息是系統或組件間通訊的一種低耦合方式,是系統級異步架構的基礎。
在 Web 消息推送中,服務端管理應用狀態,當狀態發生變遷時需要通知客戶端,完成消息推送。
Java Message Service
需要重點關注如下技術點:
消息域
- 點對點只有一個客戶端可以接收到消息。
- 發布/訂閱
廣播給訂閱的客戶端。可配置持久化訂閱。
消息確認
- 會話本地事務提交時會對收到的消息進行確認,回滾時將重傳所有消息
- 非本地事務確認:Session.AUTO_ACKNOWLEDGE、Session.CLIENT_ACKNOWLEDGE、Session.DUPS_OK_ACKNOWLEDGE
技術設計
目標
- 支持瀏覽器客戶端的推送
- 高性能、高可靠
- 模塊化,不與應用耦合
- 未來可支持多種移動客戶端
Web 層設計
Web 層考慮采用開源組件?Pushlets?進行實現。
Pushlets 組件
Pushlets 基于 HTTP 協議的發布/訂閱模型,提供了 Poll(輪詢)、Pull(拉)兩種推方式實現。其中 Pull 即長輪詢方式,當有消息時就返回。
- 發布:GET/POST 或方法調用ethod call(Dispatcher 接口)
- 訂閱:GET 流,拉/輪詢模式
- 樹形主題:可層次化訂閱
- 協議格式:JS,XML(JSON 尚未支持)
- 對使用 HTTP 協議的客戶端都可用
- 易擴展:例如事件源實現
- 方便整合:可獨立為 Web 應用,也可為 Web 應用組件
- 多種實現:J2EE/servlets,JavaScript (AJAX)
JS 客戶端
- js-pushlet-client.js
- 使用 “隱藏 iframe 技巧”
- 格式:JavaScript 函數事件
- ajax-pushlet-client.js
- 使用 XMLHttpRequest
- 格式:XML
- 不支持 HTTP 流
使用 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 為應用系統中的一個組件。
消息表管理組件提供消息新增,以及對推送過的消息記錄的查詢、刪除。
推時序
關鍵點
- 服務層消息監聽
- 消息表管理
- Pushlets 配置,License 問題:Pushlets 是以 LGPL 開源的,對于商業項目使用時必須進行封裝
- 前端容錯開關
參考
- Comet:基于 HTTP 長連接的“服務器推”技術
- 初探 HTML 5 之 WebSocket
- Pushlets 官網
- The JavaEE 6 Tutorial - Java Message Service
- 《JMS 規范教程》
轉載于:https://www.cnblogs.com/tommyli/p/3948707.html
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
- 上一篇: html5实现进度条功能效果非常和谐
- 下一篇: 简单的Ajax应用实例