利用nginx_push_stream_module实现服务器消息推送

PS:原创文章,如需转载,请注明出处,谢谢!     

本文地址: http://flyer0126.iteye.com/blog/1886149

 

       前段时间由于项目需要,关注了一下服务器消息推送,本人主要实现的是利用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 的浏览器并不多,而且一般老版本的各种浏览器基本都不支持。

 

        本文主要介绍利用 nginx-push-stream-module 实现基于AJAX的长轮询(long-polling)方式的服务器消息推送。

 

二、安装

        需要将nginx-push-stream-module以nginx的模块方式编译安装,详细的不再赘述,关于细节,可以查看官网http://wiki.nginx.org/HttpPushStreamModule

 

三、基本配置

        以下主要针对nginx的server config。

    1. 发布通道,向指定的通道发送发送消息,配置如下:

location /pub {
        # activate publisher (admin) mode for this location
        push_stream_publisher admin;

        # query string based channel id
        set $push_stream_channel_id             $arg_id;
}

     2. 订阅通道,服务器收到订阅请求,并设定消息模板及连接时间,配置如下:

location ~ /lp/(.*) {
        # activate long-polling mode for this location
        push_stream_subscriber      long-polling;

        # positional channel path
        set $push_stream_channels_path    $1;

        # message template
        push_stream_message_template        "{\"id\":~id~,\"channel\":\"~channel~\",\"text\":\"~text~\"}";

        # connection timeout
        push_stream_longpolling_connection_ttl        30s;
}

         配置好并重启nginx之后就可以开始使用Push Stream Module了。

 

四、简单应用

    1. 在终端 A 中订阅通道 ch1:

curl http://comet.flyer0126.com/lp/my_ch1

    2. 在终端 B 中向该通道 ch1 发送消息:

curl http://comet.flyer0126.com/pub?id=ch1 -d "Some Text"

    3. 在终端 A 中收到json格式的返回数据:{"id":1,"channel":"ch1","text":"Some Text"}

 

    具体在web中应用思路即:

        浏览器发送请求[Client] —> 监听数据 —> 收到数据 —> 分析状态 —> 页面显示 —> 重新发送链接(若未接收到数据相应,达到设定时长后中断当前连接,重新发起新连接)

 

    最后,附本人应用服务器消息推送实现图例(仅供参考):

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值