关于 node.js 语言的讨论

红薯
 红薯
发布于 2011年11月02日
收藏 16

本文是从 Node on nails! 这篇文章翻译而来。


在开始叙述这篇文章之前,我要非常清楚和明确的声明:“我并不是在鼓励你放弃NodeJS或转向Java”。

我一直参与在这种争论中。在我的编程界的朋友中一直存在着一种误解,他们认为NodeJS语言是将来的趋势。我对Javascript是百分百的喜 爱(不是自吹,我有一段时间曾被认为是Javascript专家,我写了很多喜欢js的文章);关于Javascript闭包的优美,原型模式编程风格的 优势,我是毫无质疑。但是,如果把Javascript放到后台,这就完全是另外一种情况了。

每当我看到有人用一些重要的技术指标对NodeJS进行测评并宣称NodeJS是世界上最快的语言时,我都会觉得好笑。(你只要用谷歌搜一下NodeJS vs *你能想到的任何东西*,你就会找到像这样, 这样, 和 这样的东西。)
撇开我的质疑,NodeJS的语言模式还是值得关注的,但我会在我的产品中使用它吗?我的问题就在这。我在使用NodeJS的过程中发现了一些非常严重的 问题;给人的感觉相当的糟。我必须写一个完整的HTTP客户包来支持Multipart 方式传送(现在这个包就是人们所知的Reston),这样我才能把文件发送到Amazon S3服务和其它一些REST服务里(当时没有任何支持HTTP Multipart 传送的组件,HTTPS也有问题,它折腾的我异常痛苦),总而言之,我需要向读者们说下面几个观点:

  • 并不是所有的web应用程序都需要大量的连接,你并不是每天都在开发一个聊天系统或一个comet系统。 NodeJS对处理某些事情很有优势,我们可以用到它。如果你是让我去在一个IRC服务器上开发一个基于websocket的聊天系统,我会推荐 NodeJS;但,如果你是让我去把邮件从你的帐号中取出然后存到RDBMS 或 NOSQL 数据库中,那我就需要思量了。
  • 技术架构选择很重要!接受它!运用它!我看到有些人选择了错误的技术路线(然后就炫耀说使用了NodeJS),然后又发现了更好的方法来实现他的任务,于是又放弃了NodeJS。
  • 如果谈论起事件为基础的代码实现和其可读性,我相信几乎每个人都会同意:回调式的代码通常比正常流程形式的代码更显得混乱。
  • 静态类型的语言比动态类型的语言更具有优势。如果你不了解编译器的内部工作原理,就不要理会这一条了。

我的经验已足够用来做一次测评的了。我有一台常见的中等性能的机器(3G内存,双核处理器),做为对比,我会直接使用Java NIO来处理HTTP请求,以“hello world”做为响应;同样的过程用NodeJS实现一次。

NodeJS代码非常的直接。我使用的版本是Node 0.4.9。请注意,这个操作依赖于’http’模块,因此又依赖于’net’,’stream’等模块。这些都是NodeJS的基本功能模块(我没有做任何特别的事情),它们依赖V8的JIT来实现高速的运行。

在Java上,我使用Java的NIP和selector 通道来实现NodeJS上的相同效果(单线程事件分发)。代码如预期中的一样,有点长,因为要做循环处理。我尽量把所有的代码都放到同一个文件里,所以,代码没有做模块化等优化。就是这两个文件:Runner.javacore.SocketSelectorCore.java。我使用了HashMaps,字符串的split,indexOf等方法来实现基本的HTTP头信息的分析,以此模拟一个普通的请求流程(读,分析,回应循环)。我使用的方法并不是很高效,但一般的时候这些方法都不是问题。

现在使用“node test.js”来启动NodeJS,使用Apache Benchmark(ab -c 1000 -n 100000),1000的并发量[细节信息],大概是每秒钟4-5千个请求的压力运行三次。

在拿我写的Java NIO的程序测试之前,我需要提醒大家几个事情。Java是一个野兽,你有一大堆的选择参数来调控JVM的垃圾堆栈大小。在我的测试中,我使用JVM运行参数是“java -server -XX:+PrintCompilation -XX:+UseConcMarkSweepGC Runner”。请注意,我使用的是verbose模式的JIT编译,这样我就能知道JVM已经初始化完毕,可以开始测试了;我还改变了GC的方法(我试了各种方法,但看起来这个方法最好)。当JVM完全启动编译后,我运行了相同的Apache Benchmarks [细节信息]测试,Java能处理每秒钟8千-8千5百的请求。

我尝试了不同的JVM堆的大小和一些其它的参数;结果非常的有趣。在我的机器上,我一直能达到每秒6千的处理能力。降低并发量((-c 100),处理能力能达到11000/s。如果你仔细看,你会发现,相对于NodeJS,我在请求里封装了更多的字节,但这并没有影响Java的处理能 力。得到了这些数据后,我还使用JRuby,用它那神奇的语法写了一个很粗燥的代码。对JRuby上一些参数的微调,用这个很简单的程序,我仍然能得到每秒4000-4500请求的处理能力。

现在,剩下的问题就是,我为什么要做这些,这些说明了什么?我想答案是相当明白。从个人的角度,我喜欢Javascript和NodeJS,但我不接受人们说的“NodeJS能做XY语 言做不到“的言论。我认为把Java或PHP或其它语言跟NodeJS进行比较的行为是愚蠢的。Java的JIT相当的先进,而Google也把V8发展 到了一个新的高度。像Netty NIO和Mina这样的框架已经存在很久了,只是因为Java的古怪的语法,对内存的贪婪,以及学习曲线,才没有引起人们的注意。我只是要破除 “NodeJS因为它的异步特征能处理更多的连接,能让你写回调风格的代码,也就是能写出更好的代码”的谬论。我的答案相当的简单:“使用Java写核心 代码,用JRuby或Scala的优美语法封装,你会得到一个更好的处理事件驱动系统的方法”。

本站文章除注明转载外,均为本站原创或编译。欢迎任何形式的转载,但请务必注明出处,尊重他人劳动共创开源社区。
转载请注明:文章转载自 OSCHINA 社区 [http://www.oschina.net]
本文标题:关于 node.js 语言的讨论
加载中

最新评论(14

Undeadway
Undeadway
现在对Node感觉非常明显地一点就是可以直接利用JSON,而java载入XML,那真是太痛苦了……
Undeadway
Undeadway
可能是自己Java写多了,写Node程序的时候经常性不自觉地使用Java模式思考问题,感觉很痛苦;而有些设计方法又必须使用这些模式来实现,感觉很矛盾……
LinkerLin
LinkerLin
Python已经足够好了。
BaiYang
BaiYang
。。。。。果然很慢,俺用 C++ 写的异步 Web 框架,在一台老旧的 T61 笔记本上测试,Windows 上(使用 Overlapped IO + IOCP)ab(-c 100)都能达到 33000+ RPS。同样的平台上,linux(使用 epoll + none blocking io)能到 4 万 RPS 左右。
笨蛋EGG
笨蛋EGG
恩··说的好!
xu81.com
xu81.com
什么语言都有适合的地方及运用的场景,就像java那众多的框架一样,过度迷信新技术只会让项目难以运作。
北落
北落

引用来自“Liuxd”的评论

引用来自“北落”的评论

客观评价 很好!放弃nodeJS是对的 不能光听别人瞎叨叨,要做对的事情,用对的语言

作者的意思不是要你放弃吧...
重要的是技术选型,根据应用场景的特点来选择相应的技术实现。
其实node.js也是有用武之地的。

对啊 听作者的话 用对的语言做对的事情
mj4738
mj4738
我喜欢这样的程序员
mj4738
mj4738
我喜欢这样的程序员
Liuxd
Liuxd

引用来自“北落”的评论

客观评价 很好!放弃nodeJS是对的 不能光听别人瞎叨叨,要做对的事情,用对的语言

作者的意思不是要你放弃吧...
重要的是技术选型,根据应用场景的特点来选择相应的技术实现。
其实node.js也是有用武之地的。
返回顶部
顶部