消息推送技术

消息推送

消息推送是针对 Web 应用开发领域的技术,指服务端以主动方式将信息送达客户端。主要用于提升用户体验,避免用户刷新页面从服务端拉取数据。例如 Web 邮件中自动出现刚收到的邮件项,Web 即时通讯自动提示新到消息等应用场景。

要实现消息推送机制,涉及两方面的内容:

  • Web 层消息推送
  • 服务层消息服务

Web 层消息推送

套接字

可以使用套接字接口进行全双工通讯。可以通过 Flash XMLSocket、Java Applet 技术实现。
但由于实现方案与厂商技术绑定过紧,不属于 Web 标准化范畴,并且存在一些限制(通讯端口开启安全、客户端插件),这里不进行描述。

HTTP 请求轮询

目前的 Web 应用是基于 HTTP 协议的,其规定了请求-响应的处理模型,位于应用层的单工通讯模式使得纯粹意义上的服务端推送方式变得难以实现。

为了基于 HTTP 协议进行“推送”实现,可由客户端发起 HTTP 请求轮询,服务端在请求后返回响应。

根据轮询时间、请求处理方式,分为以下三种推。

简单轮询

客户端一般以定时方式发起请求,服务端处理后返回响应。

  • 原理、客户端/服务端实现简单
  • 可根据应用场景调整轮询时间间隔
  • 服务端需要处理大量请求

长轮询

客户端发起请求后服务端将该请求挂起(不返回响应),直到超时、异常或需要处理响应(推内容)才返回。客户端收到响应后再次请求(即轮询)服务端,并处理响应。

  • 实时性高
  • 服务端需要管理挂起请求

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 中间件。通过发布/订阅模型实现状态同步。

处理步骤

  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 开源的,对于商业项目使用时必须进行封装
  • 前端容错开关

参考

原文: 《消息推送技术》via Google Docs

时间: 2024-08-24 07:41:45

消息推送技术的相关文章

物联网核心协议—消息推送技术演进

消息触达能力是物联网(internet ofthings, IOT)的重要支撑,而物联网很多技术都源于移动互联网.本文阐述移动互联网消息推送技术在物联网中的应用和演进. 一.物联网架构和关键技术 从开发的角度,无线接入是物联网设备端的核心技术,身份设备管理和消息推送技术是物联网云端的核心技术.而从场景体验的角度,除了前者,还要包括手机的前端开发技术. 在上一篇<一张图读懂基于微信硬件平台的物联网架构>博文中,笔者曾用一张大图详细描述了基于微信硬件平台的物联网架构的组成要素.关键场景.和通信协议

魔推MPUSH开发者程凯征:好的消息推送技术是磨出来的

开发一款程序员喜欢用的SDK不容易.也许有些开发者还不知道能够使用方便易用的消息推送平台接口服务.但是像百度.网龙.去哪儿等APP应用都是在使用消息平台接口的服务.魔推MPUSH开发者程凯征以一位标准研发人员的视角,将研发和产品设计之间的关系用"与.或.非"来阐述他对消息推送技术是如何诞生的. 目前,魔推MPUSH已经向应用开发者开放,支持包括安卓.IOS.JAVA.PHP的主流系统.从原理上来说,为应用开发者提供的SDK包嵌入到应用程序当中,就可以实现信息的推送功能.目前,广泛的做法

基于 Pushlets 的消息推送设

Pushlets 是通过长连接方式实现“推”消息的.推送模式分为:Poll(轮询).Pull(拉).本文围绕 Pull 模式进行设计. 原理 客户端发起请求,服务端接收到请求后根据 Pushlets 协议进行处理.推数据通过 HTTP 响应返回. 客户端在接收到响应后根据 Pushlets 协议进行处理,重新发起请求.Pull 模式时序: join:join 请求,服务器端建立 Pushlet 会话 join-ack:join 应答,返回会话 id listen:订阅并监听主题 listen-a

消息推送一 之介绍

什么是消息推送 所谓消息推送就是web广播,是指服务端主动向客户发送信息,主要用于提升用户体验,避免用户刷新页面从服务器拉取数据. 使用场景 web邮件的收件提醒 回帖的消息提醒 进度条 ... 实现方案 传统的消息推送技术主要是通过HTTP轮询来实现,其原理是定时向服务器发起请求拉取数据,这种方式不管服务器是否有最新数据都会发起请求,并且HTTP的Request Header很长,会占用很多的带宽和服务器资源,性能很不好: 现在主流的推送技术有webSocket.dwr等,他们可以在服务器主动

基于ajax与msmq技术的消息推送功能实现

周末在家捣鼓了一下消息推送的简单例子,其实也没什么技术含量,欢迎大伙拍砖.我设计的这个推送demo是基于ajax长轮询+msmq消息队列来实现的,具体交互过程如下图: 先说说这个ajax长轮询,多长时间才算长呢?这个还真不好界定.这里是相对普通ajax请求来说的,通常处理一个请求也就是毫秒级别的时间.但是这里的长轮询方式在ajax发送请求给服务器之后,服务器给调用端返回数据的时间多长那可还真不好说.嘿嘿,这关键要看我们啥时候往msmq队列中推送数据了,先看看推送的效果图吧..... 抱歉,没弄张

Python web实时消息服务器后台推送技术方案---GoEasy

Goeasy, 它是一款第三方推送服务平台,使用它的API可以轻松搞定实时推送!个人感觉goeasy推送更稳定,推送速度快,代码简单易懂上手快浏览器兼容性:GoEasy推送支持websocket 和polling两种连接方式,从而可以支持IE6及其以上的所有版本,同时还支持其它浏览器诸如Firefox, Chrome, Safari 等等.支 持不同的开发语言:   GoEasy推送提供了Restful API接口,无论你的后台程序用的是哪种语言都可以通过RestfulAPI来实现后台实时推送.

C(++) web实时消息服务器后台推送技术方案---GoEasy

Goeasy, 它是一款第三方推送服务平台,使用它的API可以轻松搞定实时推送!个人感觉goeasy推送更稳定,推送速度快,代码简单易懂上手快浏览器兼容性:GoEasy推送支持websocket 和polling两种连接方式,从而可以支持IE6及其以上的所有版本,同时还支持其它浏览器诸如Firefox, Chrome, Safari 等等.支 持不同的开发语言:   GoEasy推送提供了Restful API接口,无论你的后台程序用的是哪种语言都可以通过RestfulAPI来实现后台实时推送.

node.js web实时消息服务器后台推送技术方案---GoEasy

Goeasy, 它是一款第三方推送服务平台,使用它的API可以轻松搞定实时推送!个人感觉goeasy推送更稳定,推送速度快,代码简单易懂上手快浏览器兼容性:GoEasy推送支持websocket 和polling两种连接方式,从而可以支持IE6及其以上的所有版本,同时还支持其它浏览器诸如Firefox, Chrome, Safari 等等.支 持不同的开发语言:   GoEasy推送提供了Restful API接口,无论你的后台程序用的是哪种语言都可以通过RestfulAPI来实现后台实时推送.

Websocket web实时消息服务器后台推送技术方案---GoEasy

Goeasy, 它是一款第三方推送服务平台,使用它的API可以轻松搞定实时推送!个人感觉goeasy推送更稳定,推送速度快,代码简单易懂上手快浏览器兼容性:GoEasy推送支持websocket 和polling两种连接方式,从而可以支持IE6及其以上的所有版本,同时还支持其它浏览器诸如Firefox, Chrome, Safari 等等.支 持不同的开发语言:   GoEasy推送提供了Restful API接口,无论你的后台程序用的是哪种语言都可以通过RestfulAPI来实现后台实时推送.