前段时间由于项目需要,关注了一下服务器消息推送,本人主要实现的是利用nginx push实现的服务器消息推送机制,在此总结整理一下。
一、服务器推技术
Comet 基于 HTTP长连接的“服务器推”技术,是一种新的 Web 应用架构。基于这种架构开发的应用中,服务器端会主动以异步的方式向客户端程序推送数据,而不需要客户端显式的发出请求。Comet 架构非常适合事件驱动的 Web 应用,以及对交互性和实时性要求很强的应用,如股票交易行情分析、聊天室和 Web 版在线游戏等。
其实有很多种方式实现服务器推送,它们各有各的优缺点:
1. 传统轮询:
此方法是利用 HTML 里面 meta 标签的刷新功能,在一定时间间隔后进行页面的转载,以此循环往复。它的最大缺点就是页面刷性给人带来的体验很差,而且服务器的压力也会比较大。
2. Ajax 轮询:
异步响应机制,即通过不间断的客户端 Ajax 请求,去发现服务端的变化。这种方式由于是客户端主动连接的,所以会有一定程度的延时,并且服务器的压力也不小。
3. 长连接:
这也是我们之前所介绍的一种方式。由于它是利用客户端的现有连接实现服务器主动向客户端推送信息,所以延时的情况很少,并且由于服务端的可操控性使得服务器的压力也迅速减小。其实这种技术还有其他的实现方式,通过 Iframe,在页面上嵌入一个隐藏帧(Iframe),将其“src”属性指向一个长连接的请求,这样一来,服务端就能够源源不断的向客户端发送数据。这种方式的不足就在于:它会造成浏览器的进度栏一直显示没有加载完成。
4. 套接字:
可以利用 Flash 的 XMLSocket 类或者 Java 的 Applet 来建立 Socket 连接,实现全双工的服务器推送,然后通过 Flash 或者 Applet 与 JavaScript 通信的接口来实现最终的数据推送。但是这种方式需要 Flash 或者 JVM 的支持,同样不太合适于终端用户。
5. HTML5 的 WebSocket:
这种方式其实与套接字一样,但是这里需要单独强调一下:它是不需要用户而外安装任何插件的。HTML5 提供了一个 WebSocket 的 JavaScript 接口,可以直接与服务端建立 Socket 连接,实现全双工通信,这种方式的服务器推送就是完全意义上的服务器推送了,没有半点模拟的成分,只是现阶段支持 HTML5 的浏览器并不多,而且一般老版本的各种浏览器基本都不支持。
(long-polling)方式的服务器消息推送。
二、安装
需要将nginx-push-stream-module以nginx的模块方式编译安装,详细的不再赘述,关于细节,可以查看官网http://wiki.nginx.org/HttpPushStreamModule
三、基本配置
以下主要针对nginx的server config。
1. 发布通道,向指定的通道发送发送消息,配置如下:
2. 订阅通道,服务器收到订阅请求,并设定消息模板及连接时间,配置如下:
配置好并重启nginx之后就可以开始使用Push Stream Module了。
四、简单应用
1. 在终端 A 中订阅通道 ch1:
2. 在终端 B 中向该通道 ch1 发送消息:
3. 在终端 A 中收到json格式的返回数据:
具体在web中应用思路即:
浏览器发送请求[Client] —> 监听数据 —> 收到数据 —> 分析状态 —> 页面显示 —> 重新发送链接(若未接收到数据相应,达到设定时长后中断当前连接,重新发起新连接)
最后,附本人应用服务器消息推送实现图例(仅供参考):