消息推送技術

原文地址:http://88250.b3log.org/web-message-pushhtml

消息推送技術

消息推送

消息推送是針對 Web 應用開發領域的技術,指服務端以主動方式將信息送達客戶端。主要用於提高用戶體驗,避免用戶刷新頁面從服務端拉取數據。例如 Web 郵件中自動出現剛收到的郵件項,Web 即時通信自動提示新到消息等應用場景。

要實現消息推送機制,涉及兩方面的內容:前端

  • Web 層消息推送
  • 服務層消息服務

Web 層消息推送

套接字

可使用套接字接口進行全雙工通信。能夠經過 Flash XMLSocket、Java Applet 技術實現。
但因爲實現方案與廠商技術綁定過緊,不屬於 Web 標準化範疇,而且存在一些限制(通信端口開啓安全、客戶端插件),這裏不進行描述。html5

HTTP 請求輪詢

目前的 Web 應用是基於 HTTP 協議的,其規定了請求-響應的處理模型,位於應用層的單工通信模式使得純粹意義上的服務端推送方式變得難以實現。

爲了基於 HTTP 協議進行「推送」實現,可由客戶端發起 HTTP 請求輪詢,服務端在請求後返回響應。

根據輪詢時間、請求處理方式,分爲如下三種推。java

簡單輪詢

客戶端通常以定時方式發起請求,服務端處理後返回響應。web

簡單輪詢

  • 原理、客戶端/服務端實現簡單
  • 可根據應用場景調整輪詢時間間隔
  • 服務端須要處理大量請求

長輪詢

客戶端發起請求後服務端將該請求掛起(不返回響應),直到超時、異常或須要處理響應(推內容)才返回。客戶端收到響應後再次請求(即輪詢)服務端,並處理響應。ajax

長輪詢

  • 實時性高
  • 服務端須要管理掛起請求

HTTP 流

客戶端發起請求後服務器端處理請求,並經過 HTTP 流一直向客戶端寫入數據,直到超時或異常才返回響應。鏈接斷開後客戶端再次請求服務端,屬於長輪詢的一種。瀏覽器

HTTP 流

HTML 5 WebSocket

這是標準化的客戶端全雙工通信規範,但因爲目前服務端規範還沒有成型,且考慮到現有客戶端對 HTML 5 的支持有限,這裏不進行描述。安全

多客戶端支持

上述介紹是針對瀏覽器客戶端的,在實際應用場景中,還須要考慮其餘客戶端支持,例如 iOS、Android 等。

在移動客戶端方面,須要考慮以下幾點。服務器

APIs 多樣

不一樣客戶端本地 APIs 接口存在差別,但都支持基本的 HTTP 協議。直接基於 HTTP 協議進行開發可將差別最小化。websocket

網絡鏈接不穩定

通信信道打開後不必定能長時間維護,客戶端與服務端的狀態管理複雜。

最小化流量

須要儘可能最小化網絡流量,提高移動客戶端可用性。

服務層消息服務

消息是系統或組件間通信的一種低耦合方式,是系統級異步架構的基礎。

在 Web 消息推送中,服務端管理應用狀態,當狀態發生變遷時須要通知客戶端,完成消息推送。

Java Message Service

須要重點關注以下技術點:

消息域

  • 點對點只有一個客戶端能夠接收到消息。
    JMS p2p

  • 發佈/訂閱
    廣播給訂閱的客戶端。可配置持久化訂閱。
    JMS Pub/Sub

消息確認

  • 會話本地事務提交時會對收到的消息進行確認,回滾時將重傳全部消息
  • 非本地事務確認: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)

Pushlets

JS 客戶端

  • js-pushlet-client.js
    • 使用 「隱藏 iframe 技巧」
    • 格式:JavaScript 函數事件
  • ajax-pushlet-client.js
    • 使用 XMLHttpRequest
    • 格式:XML
    • 不支持 HTTP 流

使用 AJAX 客戶端,較爲靈活,便於封裝。

服務層設計

服務層消息服務採用應用服務器 JMS 中間件。經過發佈/訂閱模型實現狀態同步。

處理步驟

  1. 配置主題訂閱
  2. 應用狀態變遷時發佈 JMS 消息
  3. JMS 消息監聽器將監聽到的消息發佈到 Pushlets
  4. 將該消息寫入 Web 層消息表

消息表

保存推送多的消息記錄,用於客戶端刷新時/多客戶端查找消息。

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 開源的,對於商業項目使用時必須進行封裝
  • 前端容錯開關

參考

相關文章
相關標籤/搜索