使用Node.js和Redis实现push服务,使用Node.js搭建最简单的comet原型。

jackxiang 2013-2-20 21:48 | |
画图包:http://www.rgraph.net/docs/updating-charts-dynamically.html

raspberry安装java:http://www.simonzhang.net/?p=1530
redius node.js push:http://blog.csdn.net/unityoxb/article/details/8532028

push服务是一项很有用处的技术,它能改善交互,提升用户体验。要实现这项服务通常有两种途径,轮询和长连接。轮询就是客户端每隔一段时间就问服务器拿新数据,实现起来很简单但是服务器压力很大,而且大部分请求因为没有新数据都显得很浪费。长连接则是服务器将一个请求挂起,不输出任何内容,直到有新数据产生后才会完成这个请求,浏览器收到响应后则马上再发一个又让服务器挂住,如此反复。这么做的好处是能节省很多无用的请求,但是它不能使用传统的服务端软件,比如apache和php-fpm,客户端多了的话很容易把所有进程占光,这样服务器就没法响应新的请求了。

Node.js让这一切变得简单,它是基于事件和非阻塞I/O的服务器技术,能使用极少的资源响应大量并发的请求,非常适合长连接的要求。但是这样做还存在两个问题。首先你的服务端通常是用另外一套语言和框架做的,有成熟的代码和业务逻辑,为了实现这个push功能,难道又要用javascript来写一套吗?维护起来不嫌麻烦?其次,服务端把请求挂起后,也是不断地重复调用其它服务来获取新数据,这不过是把轮询的代码换个位置而已,本质上没区别,对服务器一样有压力。

有没有什么简单的办法来实现高效的push呢?

答案是有,而且很简单,所需代码不超过20行!

首先我们借助Redis的Pub/Sub功能来实现真正的push,其次用JSON来作为客户端和服务端沟通的数据格式。

当Node.js收到请求后,我们将请求挂起,同时实例化一个Redis客户端,并根据请求里的参数来收听一个特定的频道,原有的服务端代码(比如PHP)处理完业务逻辑后,将新数据用JSON封装下发布到这个频道,Node.js收到消息后将其作为响应传给客户端,这样就完成了一次push。代码如下



这个方法简单易用,你只需要定好一个频道和数据关系的协议,然后对现有代码做些简单修改,就能实现一个高效的push服务了!
来自:http://blog.pengqi.me/2012/12/30/implement-push-service-using-node.js-and-redis/


来自:http://www.gridshore.nl/2011/07/28/combining-java-and-node-js-through-redis-pubsub-and-a-json-remote-interface/



使用Node.js搭建最简单的comet原型:


测试方法

上面的代码保存到文件, 我们在第一个终端启动这个服务:
shell> node hello.js
我们在第二个终端模拟iframe的数据流.输入命令, 观察收到的数据(这儿在raspberry pi上get无返回):
telnet 127.0.0.1 18124  
GET /mymessages HTTP/1.1  
HTTP/1.1 200 OK  
content-type: text/plain  
Connection: keep-alive  
Transfer-Encoding: chunked
我们在第三个终端输入curl -X PUT命令, 模拟发送两条消息:

shell> curl -X PUT "http://127.0.0.1:18124/mymessages?a=1&b=2&c=3"
ok  
shell> curl -X PUT "http://127.0.0.1:18124/mymessages?a=4&b=5&c=6"
ok
观察第二个终端, 会发现已经收到两条HTTP chunked. (为了避免测试数据小于MTU, 我实际上多输出了一些空格,但这里省去了.)
202  
a=1&b=2&c=3  
202  
a=4&b=5&c=6
来自:http://developer.51cto.com/art/201202/315327.htm


而上面这个是属于Node.js实现的后端(当然这个也可以用Nginx的Push,这个Push不是一条链接,是要换一下,但实时性还是不错的),而前端怎么弄呢?【Nginx的Push参考这个: http://code.adrianvera.com/comet-server-nginx-push-ubuntu-11.10 ,我前面的个人博客了呢写,自己虚拟机里有陪着好的可以参考。】

前端参考这一段代码:

作者:jackxiang@向东博客 专注WEB应用 构架之美 --- 构架之美,在于尽态极妍 | 应用之美,在于药到病除
地址:http://jackxiang.com/post/6048/
版权所有。转载时必须以链接形式注明作者和原始出处及本声明!


最后编辑: jackxiang 编辑于2013-2-24 18:32
评论列表
发表评论

昵称

网址

电邮

打开HTML 打开UBB 打开表情 隐藏 记住我 [登入] [注册]