消息推送

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

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

Web 层消息推送

服务层消息服务

Web 层消息推送

套接字

可以使用套接字接口进行全双工通讯。可以通过 Flash XMLSocket、Java Applet 技术实现。

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

HTTP 请求轮询

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

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

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

简单轮询

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

原理、客户端/服务端实现简单

可根据应用场景调整轮询时间间隔

服务端需要处理大量请求

XUJxUXuJEJgbttV4aXKIROD31zUGLJdJXd4EnU1nmy8OCW8BNbRLd0nKv4lFEirFn3mIdIKLDqv2FtICCJ49j5W2YPIfXDGUj0g-OqxKYUSR

长轮询

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

实时性高

服务端需要管理挂起请求

PMeC9Y-ZeMcZsTYLOetsNhNWPyFDGuBSZljbfAzaQX-ig_S-Gd4zBL_P5Ukv0NoD5nLJ0jMI10NbX97bnkgkqWqXYoacs7LD6ls4aQQfnItF

HTTP 流

客户端发起请求后服务器端处理请求,并通过 HTTP 流一直向客户端写入数据,直到超时或异常才返回响应。连接断开后客户端再次请求服务端,属于长轮询的一种。

DRt_gJug4kpK4ZNq4qJ6v8hXZJ-Du23Z0x2bxCPq7d_ANMuI31UBMEW-Obd3Y-f2FA6GKzQLxjRq3ojaKeH7N2GzxLtDdb8w5rdfhcPGsZLm

HTML 5 WebSocket

这是标准化的客户端全双工通讯规范,但由于目前服务端规范尚未成型,且考虑到现有客户端对 HTML 5 的支持有限,这里不进行描述。

多客户端支持

上述介绍是针对浏览器客户端的,在实际应用场景中,还需要考虑其他客户端支持,例如 iOS、Android 等。

在移动客户端方面,需要考虑如下几点。

APIs 多样

不同客户端本地 APIs 接口存在差异,但都支持基本的 HTTP 协议。直接基于 HTTP 协议进行开发可将差异最小化。

网络连接不稳定

通讯信道打开后不一定能长时间维护,客户端与服务端的状态管理复杂。

最小化流量

需要尽量最小化网络流量,提升移动客户端可用性。

服务层消息服务

消息是系统或组件间通讯的一种低耦合方式,是系统级异步架构的基础。

在 Web 消息推送中,服务端管理应用状态,当状态发生变迁时需要通知客户端,完成消息推送。

Java Message Service

需要重点关注如下技术点:

消息域

点对点只有一个客户端可以接收到消息。

oj2PNEoFu8m2okWiac_zaGt3K2IJbar0kGaoyT37T2ISuZWAUPpTS5vYe6lKkwu97X_BmcAJZqr65ADI1CJySwEC0zNS_1KxdgNr0TCiB1vA

发布/订阅广播给订阅的客户端。可配置持久化订阅。

VHEjLFAvYPBmgzdNChfs3LIOxldB1CSbyo5Me5s0wtB0HGUgqmB5L_QFeGwsWW-NE02Ikgyv9WX5rJ8dyESLIeu1rW3GJLT-ijGYqX_5Ivi1

消息确认

会话本地事务提交时会对收到的消息进行确认,回滚时将重传所有消息

非本地事务确认:Session.AUTO_ACKNOWLEDGE、Session.CLIENT_ACKNOWLEDGE、Session.DUPS_OK_ACKNOWLEDGE

技术设计

目标

支持浏览器客户端的推送

高性能、高可靠

模块化,不与应用耦合

未来可支持多种移动客户端

Web 层设计

Web 层考虑采用开源组件Pushlets进行实现。

Pushlets 组件

Pushlets 基于 HTTP 协议的发布/订阅模型,提供了 Poll(轮询)、Pull(拉)两种推方式实现。其中 Pull 即长轮询方式,当有消息时就返回。

发布:GET/POST 或方法调用(Dispatcher 接口)

订阅:GET 流,拉/轮询模式

树形主题:可层次化订阅

协议格式:JS,XML(JSON 尚未支持)

对使用 HTTP 协议的客户端都可用

易扩展:例如事件源实现

方便整合:可独立为 Web 应用,也可为 Web 应用组件

多种实现:J2EE/servlets,JavaScript (AJAX)

8S-KISi-hjZgpreYT1Tc0goKRzC5xGmSCeOKvr4LPSBmld5RpUfzBOat5FMKp_hegK_Q_uRcyabXQt8qXxAt5Mzmo3QOF6GxyslTxJ_DDfwm

JS 客户端

js-pushlet-client.js

使用 “隐藏 iframe 技巧”

格式:JavaScript 函数事件

ajax-pushlet-client.js

使用 XMLHttpRequest

格式:XML

不支持 HTTP 流

使用 AJAX 客户端,较为灵活,便于封装。

服务层设计

服务层消息服务采用应用服务器 JMS 中间件。通过发布/订阅模型实现状态同步。

处理步骤

配置主题订阅

应用状态变迁时发布 JMS 消息

JMS 消息监听器将监听到的消息发布到 Pushlets

将该消息写入 Web 层消息表

消息表

保存推送多的消息记录,用于客户端刷新时/多客户端查找消息。

userId

createdTime

lastGetTime

clients

msg

type

timeout

targetSys

srcSys

….

xxx

xxx

xxx

[“pc”, “iOS”]

{}

公告

3天

OA

OA

消息体使用 JSON 字符串存放于 msg 字段中。其余字段可根据通用性进行抽取,比如用户名等。

消息监听器接收到消息时推 Pushlets,并进行记录写入(记录 lastGetTime 为写入时间,表示这条消息已经推送过)。

设置定时任务对超时记录进行删除。

逻辑架构

JMS 消息系统为单独的通讯总线服务独立于应用系统,Pushlets 为应用系统中的一个组件。

消息表管理组件提供消息新增,以及对推送过的消息记录的查询、删除。

JueHh5mlht5bg6oDBz8CWZAW-V1BeC3-GXuEvTSfY8yUPld_FZGVx9IxMipdZG-AGKDE_ifDQYRpGDXCfNgSsuWKF2kAe2PcsLtY0KoDJboV

推时序

hf407_aORSICX_nsh3e09ao_xif53C9p6q0hNPTtr0rA7RtOB0pjeuuz1KycS7gc3EZ6-Xfw9HQ6uVQMAvNcEcrPGsKYR3pBjUjCgT7Q97F3

关键点

服务层消息处理JMS 对于应用开发是透明的,应用只需调用封装好的发送接口,继承监听接口。发送时根据应用场景设置主题属性,监听处理时根据消息属性实现处理逻辑。

消息表管理需要使用定时任务或手动触发清除历史消息。

Pushlets 配置,License 问题:Pushlets 是以 LGPL 开源的,对于商业项目使用时必须进行封装:《基于 Pushlets 的消息推送设计》。

参考

摘抄自:https://docs.google.com/document/d/1qHVKlGz1raVemA2eHMSrPQppVKAiIrnFmfkpoyYE-U4/edit?pli=1#

java的消息机制协议_消息推送机制技术设计相关推荐

  1. 移动手机消息推送机制

    由于公司要做一个android的消息推送功能,让我进行了一个调研,发现网上没有一个集中说明的地方,自己在网上搜罗了一些资料并且自己总结了一下. 对于消息的提醒方式可以分为四种:固定窗口.弹出窗口.手机 ...

  2. Android消息推送机制

    1.推送方式基础知识: 当我们开发需要和服务器交互的应用程序时,基本上都需要获取服务器端的数据,比如<地震应急通>就需要及时获取服务器上最新的地震信息.要获取服务器 上不定时更新的信息一般 ...

  3. android系统下消息推送机制

    一.推送方式简介: 当前随着移动互联网的不断加速,消息推送的功能越来越普遍,不仅仅是应用在邮件推送上了,更多的体现在手机的APP上.当我们开发需要和服务器交互的应用程序时,基本上都需要获取服务器端的数 ...

  4. ios消息推送机制原理与实现(转)

    今天给无线事业部的同事开发苹果客户端的推送接口.无线事业部就是我们公司专门开发各种终端的app的部门啦! 无线事业部的同事做事还是很体贴的,同时发给了我参考文档地址和需要的开发需要的pl2文件. 提供 ...

  5. 【转】android系统的APP消息推送机制

    原文:https://www.jianshu.com/p/f898a2c02b05 参考文章: http://blog.csdn.net/carson_ho/article/details/52862 ...

  6. iOS开发如何实现消息推送机制

    Push的原理: Push 的工作机制可以简单的概括为下图 图中,Provider是指某个iPhone软件的Push服务器,这篇文章我将使用.net作为Provider. APNS 是Apple Pu ...

  7. android开发 app消息提醒功能,Android中利用App实现消息推送机制的代码

    1.消息推送机制 服务器器端需要变被动为主动,通知客户一些开发商认为重要的信息,无论应用程序是否正在运行或者关闭. 我想到了一句话:don't call me,i will call you! qq今 ...

  8. 国内APP消息推送机制以及微信消息延迟问题剖析

    转自:https://club.huawei.com/thread-15878044-1-1.html 一.前言 随着安卓手机以及QQ/微信/支付宝/滴滴出行/美图外卖等一大批移动通信/移动消费应用的 ...

  9. 【转】推送消息推送机制

    原文链接:推送消息&推送机制 - 知乎 消息推送(push)用一句话解释就是:服务端向客户端发送了一条消息,我们在通知栏.锁屏通知.微信消息等等之类的都是消息推送. 1/推送类型有哪些? 消息 ...

  10. 苹果消息是先推送到服务器,iPhone消息推送机制实现与探讨

    http://www.cocoachina.com/iphonedev/sdk/2011/1124/3599.html 最近两天在研究ios的消息推送机制.研究这个东西,还是充满兴趣的. Push的原 ...

最新文章

  1. pfSense 2.4.3 发布,包含重要的安全修复补丁
  2. 我开发的代码,如何申请版权_代码简介:我花了3个月时间申请开发人员职位。 这是我学到的。...
  3. 区域人工智能集群效果显著 各大省市怎样布局?
  4. Android Studio 启动模拟器出现“Timed out after 300seconds waiting for emulator to come online“解决方案
  5. python处理表格数据-基于Python快速处理PDF表格数据
  6. .NET一个线程更新另一个线程的UI(两种实现方法及若干简化)
  7. java随机数转换_Java获取随机数的3种方法(转)
  8. 10 个超炫酷后台控制面板(附 GitHub下载链接)
  9. hql取满足条件最新一条记录_MySql 之一条查询sql的执行过程
  10. 分享一个关于生鲜电商的竞品分析报告
  11. 【分享】浅析Quora的技术架构
  12. Qt中QScrollArea控件区域与滑动条的颜色不一致设置
  13. cophenet matlab,Matlab聚类分析[转]
  14. ES6--阮一峰版笔记
  15. 新版电脑版微信终于可以用上小程序了
  16. python raise函数
  17. 博弈的扩展式纳什均衡贝叶斯均衡是什么纳什均衡说明什么纳什均衡(Nash Equilibrium)
  18. 加密软件TrueCrypt推荐,也许是最好的加密软件
  19. 趋易避难,人之本性!
  20. android 视频投屏,USB视频投屏

热门文章

  1. Jmeter学习(一)
  2. poj 3080 Blue Jeans【字符串】
  3. 这 8 个 Python 技巧让你的数据分析提升数倍!
  4. 8 行代码用Python画一个中国地图
  5. 如何优雅地计算多变量
  6. c#+asp.net如何删除指定路径下的文件和文件夹
  7. 关于ThinkPHP框架项目在二级目录时,__PUBLIC__路径的问题
  8. FPGA实现任意分频 为所欲为——教你什么才是真正的任意分频
  9. 失败的人只有一种,就是在抵达成功之前放弃的人
  10. SharePoint 2010的Form认证的用户注册功能