JavaScript NodeJS 适合用来做什么?

fantasyday · 2012年01月28日 · 最后由 oa414 回复于 2012年12月08日 · 27695 次阅读

正在考虑要不要去学 node.js,想问下有经验的朋友,它最适合做什么?

"Real time","No Block"貌似是 node.js 的特点,不过对于没事写写 “传统” 小项目的我来说,sinatra 以及 rails 已经够满足自己的需求了。

看了作者 Ryan 的视频,也看过简单的聊天程序的例子,除了这些以外还有什么实际的例子吗?

个人觉得写 API Service 和后台服务很合适。我们公司内部有好多项目在用。最近为了对 iDaily 增加又拍云存储的支持(作为一个单独服务对现在的 CloudFront 数据进行并行上传),写了一个简单的开源 node api 实现。

#1 楼 @ashchan 看 Linkedin 的 mobile 平台也是那么用的,api 和后台服务。

#1 楼 @ashchan 能详细说说写 API Service 和后台服务的好处所在,比起传统的方案来说, 谢谢!

#4 楼 @clc3123 如此详细的答复,真是感谢感激啊!!应用情景终于是了解了,确实类似 “个人小博客” 之类的小东西是完全没必要。就是感觉有用户有规模的 “大” 项目才能充分发挥它的特点有些遗憾。。。不过对于非常熟悉 js 的人或许就会当做是 js 版的 sinatra(是叫 Express 的框架吧?)来用吧,公司里 front-end engineer 很多都是用 node 写 prototype。

#4 楼 @clc3123 大赞! #3 楼 @dave 4 楼算是帮我回答了:) #6 楼 @fantasyday 做 prototype 是很方便。Express 确实是参照 Sinatra 来实现的。不过我个人觉得 “小” 项目(或大项目里的很多小块)用 Node 也是合适不过。以 API 来说,除了 @dave 说的好处,轻巧、占资源少都是其优点。实际 Rails 项目中,用 ActionController 来实做 API 经常会觉得有点过重。

其他小到如简单的网页抓取,用 Node 来替换 Mechanize 也很合适。多线程编程变成了简单的遍历和 callback。

当然非阻塞只是它的优点之一而已,如 4 楼的例子,即使是 Node 来实现,如果实际任务完成后要反馈给 request,那还是要 callback 至请求端或以串行的方式来处理的。这种情况为了避免阻塞, Rails 或 Sinatra 也完全可以用后台任务的方式来处理的,同样能把那 1100 秒降为 11 秒。换句话说,不阻塞请求是因为对每一个请求进行 fire and forget 的缘故。

Node 一方面到处都是 callback(与上面的 callback 不是同一回事),与 Ruby 和其他很多语言中的习惯流程有很大区别。另一方面,在处理非阻塞 IO 时真是太方便(我们的实例中,一个 mp3 在解码后会同时上传到 S3、又拍云、自己的服务器,这种操作中确实是把处理时间由 a+b+c 变成了 max(a, b, c),同时又直接返回给 api 调用端通知已经开始处理,好处多多)。

#7 楼 @ashchan 现在在哪家公司?

用纯粹的 eventmachine,效果和 node.js 差不多,eventmachine, erlang, node.js 三者的效果貌似都非常接近,我折腾了一圈,最终决定用 node.js 用在公司的一个项目中用来响应大量实时的请求,需要大并发,实时响应,目前用下来,就是一开始种种 callback 不习惯,习惯了以后,还是很好用,代码量也不大,关键是自己要明白,要控制住,效能上,目前还没有上实际的环境受过真正的压力,有待进一步调教

#7 楼 @ashchan 受教了,问个 node 的问题。请问 node 现在对于 mysql 和 postgresql 的支持如何?尤其关心 pg~EM 的 pg 支持一直感觉不是很给力,和 activerecord 的结合更是感觉有上顿没下顿,ruby 社区貌似对 em 也不是很关心。觉得这类场景还是用 node 比较主流点,希望能帮我解答下~

#11 楼 @clc3123 很不好意思。我经手的项目用到数据库的,都是用的 MongoDB,所以对 MySQL 和 PG 的支持程度没有切身体会。瞄了一眼,MySQL 的话这两个似乎不错:

前面这个似乎是被 Nodejs 官方推荐的,C++ 写就,性能应该比较高。后面这个的作者 felixge 在 Node 社区挺有名,质量应该也让人放心。

相信 PG 应该也有不错的支持。

@clc3123 告诉你一个不幸的消息 sinatra 是多线程的, 前一个请求卡住了后面一个还能请求。

node 和 EM 都是用 c++ 写的 EM 看文档上打算用 c 重写,为了性能和兼容性啥的。但是 EM 的插件真的没有 node 多,支持和社区也没有那么多。写 Rails 的人, JS, Ruby 都熟悉随便哪个都能很快上手。

Erlang 最近学了一下,要写业务逻辑负责的东西,我看还是算了吧,支持的库也没有 Rails 或者 node 多。

但是他的分布式能力和 cpu 多核利用能力天生的。搜索了一圈。erlang 做的最多的就是聊天室了,还有消息服务器。其实就是聊天室的底层的服务。就这样。为通信行业所生的语言。

用 go lang 吧 ;)

我们做过详细的性能比较:

https://github.com/hlxwell/performance_evaluation

最终领导选择了 golang ...

个人观点,nodejs 适合了解 javascript 的人短时间做出一个适应大量负载的网站。想要在高并发领域更加深入,还需要 erlang, haskell 这样的重型武器。

node 也可以当后台的 parser,这个 http://stylesror.github.com 就是用 node + jade 渲染成 html 的 :)

http://meteor.com 可以看一下这个。。 基于 nodejs 的神奇实时框架 , 未来的 web app 就该是这个样子

nodejs 只是一个点,基本做 web.app,用 nodejs 做啥都可以。

#19 楼 @xds2000 同意,基本上 node 是什么都能做的,只是刚好被大家拿来跟 Rails 比较。

#13 楼 @hlxwell sinatra 不是 web server,不负责多线程。

@clc3123 是的,他不是 web server,但是应用程序如果支持多线程,你 web server 才有机会去并发处理多请求。你 web server 多线程,像 Rails 应用,跑一个 instance 怎么跑都只能同时处理一个请求。

两个 sinatra 配置项:

  • lock Places a lock around every request, only running processing on request per Ruby process concurrently. Enabled if your app is not thread-safe. Disabled per default.

  • threaded If set to true, will tell Thin to use EventMachine.defer for processing the request.

#22 楼 @hlxwell 多谢提示。thin 的 threaded 模式真的没用过。

好文,mark!

#18 楼 @aNdReW_Qx 这个框架有什么用?

#4 楼 @clc3123 赞一个,去看看

node.js 可以写爬虫

匿名 #28 2012年05月31日

看好 Node :)

#27 楼 @sunzheng91 爬虫为什么不用 python 写呢?是因为 callback 的好处?

#29 楼 @zhenning #27 楼 @sunzheng91 哈哈哈 我还想问爬虫为什么不用 Ruby 呢 EventIO,字符处理,正则,HTML 解析都是灰常方便的哇!

#29 楼 @zhenning node 下面有 jQuery,而且 node 的速度优化得很好

#30 楼 @hooopo 嗯,但是感觉还是 jQuery 方便一些。不过 node 的 http GET 实在是不方便

这个帖子不错

#32 楼 @sunzheng91 #30 楼 @hooopo 上面提到的几个点,我都没觉得是优势。 使用 python 的原因是因为有些库会稳定一点。如 BloomFilter 的使用。

#34 楼 @zhenning 看了这条贴子才知道 Python 下面有这么成熟的 BloomFilter,不错。不过目前写的爬虫还没有考虑到效率优化的问题,用 node.js 很不错。

#30 楼 @hooopo ruby 族谱爬虫除了那个 “锯”,还有别的好方法不?或者直接解析?

#8 楼 @iceskysl eoe 的老大也来了

#4 楼 @clc3123 解释的很清楚。

#37 楼 @oa414 多謝,之前隨便搜了下,只有那個 “鋸” 看起來還行。沒想到還有這麽多 spider!回頭好好研究下

sqsy 整理学习 EventMachine 的一些文章和帖子 提及了此话题。 09月08日 17:05
需要 登录 后方可回复, 如果你还没有账号请 注册新账号