`
lua
  • 浏览: 77031 次
  • 性别: Icon_minigender_1
  • 来自: 大连
文章分类
社区版块
存档分类
最新评论

有趣的Comet技术选择,论 Is node.js best for Comet?

阅读更多

http://sunxiunan.com/?p=1768

 

首先要声明,我对Comet技术只了解皮毛,下面的评论如果有错误欢迎各位看官指出。本文相关博客地址:http://amix.dk/blog/post/19577#Is-node-js-best-for-Comet

amix在这篇博客中谈论他们在Plurk中Comet技术选择的变迁。

 

说句题外话,他有另外一篇博客
http://amix.dk/blog/post/19581#The-main-issue-with-non-blocking-servers
里面用两张图形象的介绍了阻塞式服务器与非阻塞式服务器的工作方式,感兴趣的可以去瞅瞅。amix关于node.js和v8的介绍可以看这里http://amix.dk/blog/post/19484#Comet-with-node-js-and-V8

 

关于Comet技术,可以参考维基百科 http://en.wikipedia.org/wiki/Comet_%28programming%29
国人有个开源项目http://code.google.com/p/eurasia/ 好像是做类似工作。

回到这篇博客上来,amix提到他们在项目中针对comet技术的选择,一开始是使用fast polling with C memcached nginx libevent,实现代码可以参考
http://amix.dk/blog/post/19414#Fast-polling-using-C-memcached-nginx-and-libevent
后来这个方案碰到局限了,不知什么局限,总之是不好用了。

 

于是实验了很多其它的comet方案,但是都不成熟。所以他们用Java与Netty实现一套comet方案,可以参考
http://amix.dk/blog/post/19456#Plurk-Comet-Handling-of-100-000-open-connections
文 章里提到Twisted缺点是太耗CPU而且不易扩展;Jetty太耗内存;Tomcat也是很耗费内存;apache Mina文档不行,而且也不易扩展。最后选择了Netty,amix没有提到他们如何用Netty实现的,所以估计想用这个方案的朋友得单独联系他了。

 

后来amix发现node.js不错,他把java方案移植到nodejs上,只用了2天时间。在过去8个月(从2010年2月到10月)nodejs方案每天可以服务几百万用户的comet提醒。

但是,总有但是,随着网站用户增多,nodejs方案也碰到瓶颈了。即使试着做了一些优化和增加硬件,效果并不明显。amix他们又回到Netty 方案,经过一些代码优化后,尽管内存使用量大于nodejs方案,但是性能要好于后者。Netty方案每秒可以为10000个客户端提供约6000个 comet提醒,而Nodejs方案只能每秒服务500个,所以可以说新的Netty方案有10倍以上改进。

 

amix总结道,node.js是一个非常棒的方案,至少撑了8个月,而且实现起来也很快。但是nodejs有致命的缺陷。这个缺陷来自nodejs的基石-V8 JavaScript引擎。

 

V8引擎不支持线程或者进程机制-每件事都是主进程处理,甚至包括垃圾收集。

 

对于浏览器而已,这个限制是一个聪明的选择,大家知道每个Chrome页面就是一个单独的进程,所以V8引擎这种方案很好用。但是对于服务器架构就 不一样了,这种单进程单线程的限制就变得麻烦。(具体为何麻烦我也不知道,也没写过nodejs项目)关于V8在服务器端使用的局限性,Nginx作者也 有一篇博客介绍Why is Google V8 is not suitable for embedding in servers http://sysoev.ru/prog/v8.html 大家可以通过google翻译成英语阅读(翻译成中文后读起来很奇怪,还不如英语好懂),主要也是抱怨异常处理、进程模型、垃圾收集这几个方面。对于浏览器比较适合的V8方案,在服务器端就变成无法承受之重。

 

后面的回复也值得参考,其中有人提到使用nginx建立Nodejs集群然后分发,有人建议说重写nodejs的http模块很好用,也有人建议fugue这个方案http://github.com/pgte/fugue ,nodejs作者Ryan Dahl也留言说明前面版本某个bug可能导致性能问题。

 

偶个人的感想:即使amix有这样的抱怨,但可以看出nodejs依然是服务器端实现comet的很好选择,异步编程、高并发、低功耗,而且作者非 常活跃,社区膨胀的非常快,个人感觉nodejs活跃度已经超过Lua。Lua社区有些程序员也试图用libevent或者libev来为Lua加上非阻 塞异步服务器端编程的能量,但是影响力都不够,成熟度也不如nodejs。接下来偶会对nodejs做更多的探究,从源代码到小程序编写应用,希望能通过 nodejs提高一下自己对服务器端编程的理解。

分享到:
评论

相关推荐

    comet4j 所需js以及comet4j-tomcat6.jar、comet4j-tomcat7.jar包

    首先,`comet4j.js`是Comet4j的JavaScript库,它在客户端起着至关重要的作用。这个文件提供了与服务器端Comet4j服务交互的接口,允许网页通过JavaScript代码订阅和接收来自服务器的实时消息。在网页应用中,开发者...

    comet4j-tomcat7.jar comet4j.js

    Comet4J是一个针对Java平台的服务器推送框架,它的核心理念是利用Ajax(XMLHttpRequest)技术来实现服务器向客户端的实时数据推送。在传统的HTTP协议中,服务器与客户端的通信通常依赖于客户端发起请求,而服务器...

    comet4j-tomcat7.jar

    comet4j消息推送所需的comet4j-tomcat7.jar包,comet4j-tomcat7.jar

    comet4j-tomcat6.jar和comet4j-tomcat7.jar和comet4j.js

    描述中提到的"comet4j.js"是Comet4j的JavaScript客户端库,它负责在浏览器端与服务器进行交互,实现跨域通信和数据推送的接收。这个文件通常会被包含在Web应用的HTML页面中,以支持客户端与服务器之间的实时通信。 ...

    comet4j-tomcat6.jar、comet4j-tomcat7.jar、comet4j.js

    `comet4j.js`是客户端JavaScript库,它负责在浏览器端处理与服务器的长连接交互。通过这个脚本,开发者可以方便地在前端实现与Comet4J服务器端的通信,接收服务器推送的数据,并在页面上实时展示。 4. **使用方法*...

    comet4j-tomcat7.jar和comen4j.js

    Comet4J是一种基于Java的服务器推技术框架,它允许服务器主动向客户端推送实时更新的信息,而无需客户端频繁地发送请求。在Web开发中,这种技术对于实现聊天、实时通知、股票报价等需要即时更新的应用场景非常有用。...

    使用Node.js+Socket.IO搭建WebSocket实时应用

    ### 使用Node.js+Socket.IO搭建WebSocket实时应用 #### WebSocket与实时推送技术 随着互联网技术的发展,用户对于数据的即时性有了更高的要求。实时推送技术,即Realtime技术,旨在实现无需用户手动刷新页面就能...

    comet4j.js,comet4j-tomcat6.jar,comet4j-tomcat7.jar

    Comet4J(Comet for Java)是一个纯粹基于AJAX(XMLHTTPRequest)的服务器推送框架,消息以JSON方式传递,具备长轮询、长连接、自动选择三种工作模式 文件包含comet4j-tomcat6.jar , comet4j-tomcat7.jar , comet4j.js...

    comet4j.js+comet4j-tomcat7jar包资源

    在给定的资源包中,有两个关键文件:`comet4j-tomcat7.jar`和`comet4j.js`。它们分别是Comet4J框架在Tomcat 7上的实现和前端JavaScript库。 1. `comet4j-tomcat7.jar`: 这个jar文件是Comet4J框架的核心组件,专门...

    comet4j_7.jar和comet4j-0.0.2.js

    Comet4j是一个开源的Java库,主要用于实现服务器向客户端的实时推送技术,常用于构建聊天应用和其他需要实时交互的Web服务。这个技术基于HTTP长连接(Comet技术),能够克服传统的HTTP请求-响应模式中延迟高、效率低...

    nodeJS.pdf

    ### Node.js 快速入门与核心技术解析 #### 标题:NodeJS.pdf 该文档主要介绍了Node.js的基础概念、发展历程以及其在服务器端JavaScript开发中的应用。Node.js是一种基于Chrome V8引擎的JavaScript运行环境,它使...

    comet-ml-api:适用于comet.ml的Node.js SDK

    适用于Comet.ml的Node.js SDK 基于增压机器学习库 文献资料 请参阅Comet.ml API 安装 npm install comet-ml-api 例子 const CometMlAPI = require('comet-ml-api'); const apiKey = 's9ILl8ox92nZSTVh8eo4B47LC'; ...

    comet4j-tomcat6.jar.rer

    【描述】提到"comet4j-tomcat7.jar"是与"comet4j.js"一起使用的,这表明该技术不仅涉及到服务器端的处理,还涉及到客户端的JavaScript支持。Comet4j.js可能是与服务器端的comet4j服务进行通信的前端脚本库。通过这种...

    comet4j-tomcat6.jar|comet4j-tomcat7.jar下载_以及对Jfinal类以及Zcurd项目的支持

    Comet4j为针对java web项目的后台消息推送工具,支持后台主动往浏览器推送消息。附件rar包提供Comet4j基础资源包下载,适用于所有Comet4j项目,同时特别针对comet4j对Jfinal类以及Zcurd项目的支持做了一些注意事项...

    C#Web即时通讯Comet框架

    这个例子可能包括服务器端代码和客户端JavaScript代码,通过创建连接、发送和接收消息,以及处理推送的数据,展示了Comet技术在实时聊天、股票更新、在线游戏等场景中的应用。 **总结** Comet技术为Web即时通讯...

    comet4j-tomcat6,comet4j-tomcat7,comet4j.js,以及一个样例

    `comet4j.js`是Comet4J的JavaScript库,用于客户端与服务器端的交互。这个JavaScript文件提供了API,使得前端开发者能够轻松地与Comet4J服务器端接口进行通信,实现长轮询、HTTP流或隐藏IFrame等Comet技术。这些技术...

    服务器推送技术之comet4j资源包

    `comet4j.js`是客户端JavaScript库,它是Comet4j技术在浏览器端的实现。这个文件包含了用于建立和管理与服务器的持久连接,接收和发送数据的函数和对象。开发者可以通过调用这些函数,轻松地在前端应用中集成Comet4j...

    nodejs 入门级文档 mixu pdf

    Node.js是一种基于Chrome V8引擎的JavaScript运行环境。它使用了一个事件驱动、非阻塞I/O模型,使得JavaScript能够应用于服务器端,执行高强度的网络任务。Node.js的设计哲学非常独特,它不是简单的把JavaScript用于...

Global site tag (gtag.js) - Google Analytics