设为首页 收藏本站
查看: 650|回复: 0

[经验分享] 利用nginx_push_stream_module实现服务器消息推送

[复制链接]

尚未签到

发表于 2016-12-27 10:44:18 | 显示全部楼层 |阅读模式
PS:原创文章,如需转载,请注明出处,谢谢!     
本文地址: http://flyer0126.iyunv.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] —> 监听数据 —> 收到数据 —> 分析状态 —> 页面显示 —> 重新发送链接(若未接收到数据相应,达到设定时长后中断当前连接,重新发起新连接)
  最后,附本人应用服务器消息推送实现图例(仅供参考):
DSC0000.jpg
 

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-320142-1-1.html 上篇帖子: Nginx学习之十-超时管理(定时器事件) 下篇帖子: Nginx区分PC或手机访问不同网站
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表