UDN-企业互联网技术人气社区

板块导航

浏览  : 3512
回复  : 24

[问答] 使用 Node.js 的优势和劣势都有哪些?

[复制链接]
朱晟的头像 楼主
发表于 2015-7-30 17:39:14 | 显示全部楼层 |阅读模式
有大公司用吗?
发表于 2015-7-30 19:09:21 | 显示全部楼层
  我们在用 Node.js 处理论坛主站的 web 实时推送。你现在看到的 Feed 、消息的实时更新,背后就是几个 node 进程扛起来的。

  优点:

  1. 处理高并发场景性能更高

  在用 http://socket.io 之前,推送服务是用 ajax polling 做的。我们用 Tornado 和 Node.js 做过两个版本的推送服务。在当时的测试环境下,Node.js 的 CPU 时间是 Tornado 的三分之一,内存使用是 Tornado 的一半,代码行数只有 Tornado 的三分之一(Node.js 版是用 coffee 写的)。后来我们使用了 http://socket.io,CPU 开销进一步降低。

  2. 函数式编程非常适合写异步回调链

  用 Node.js 配合 CoffeeScript 写异步操作链非常便利,相比之下 Tornado 无论是写命名函数的回调,还是 yield 一个 Task 都没那么自然。

  缺点:

  1. 大量匿名函数使异常栈变得不好看。

  2. 无法以 request 为单位 catch 异常,必须确保不要在不 catch 异常的第三方库的回调里的抛异常,这在一个异步操作链条里是一件比较麻烦的事。解决方法之一是对那些不 catch 异常的第三方库做一些封装,把所有的异常变成事件,改成 on('error') 形式的 API。
使用道具 举报

回复

发表于 2015-7-30 21:29:33 | 显示全部楼层
  先回答第二个问题吧。Node.js其实有很多大公司都在用的,比如eBay, Microsoft, 你可以去Node.js官网看看:node.js

  要想知道更详细的列表,可以看这里:https://github.com/joyent/node/wiki/Projects,-Applications,-and-Companies-Using-Node

  再稍微花点时间,搜集一些网上资料回答第一个问题:优势和劣势。

  要讲清楚这个问题,先讲讲整个Web应用程序架构(包括流量、处理器速度和内存速度)中的瓶颈。瓶颈在于服务器能够处理的并发连接的最大数量。Node.js解决这个问题的方法是:更改连接到服务器的方式。每个连接发射一个在Node.js引擎的进程中运行的事件,而不是为每个连接生成一个新的OS线程(并为其分配一些配套内存)。Node.js不会死锁,因为它根本不允许使用锁,它不会直接阻塞 I/O 调用。Node.js还宣称,运行它的服务器能支持数万个并发连接。

  Node本身运行V8 JavaScript。V8 JavaScript引擎是Google用于其Chrome浏览器的底层JavaScript引擎。Google使用V8创建了一个用C++编写的超快解释器,该解释器拥有另一个独特特征:您可以下载该引擎并将其嵌入任何应用程序。V8 JavaScript引擎并不仅限于在一个浏览器中运行。因此,Node.js实际上会使用Google编写的V8 JavaScript引擎,并将其重建为可在服务器上使用。

  Node.js优点:

  1、采用事件驱动、异步编程,为网络服务而设计。其实Javascript的匿名函数和闭包特性非常适合事件驱动、异步编程。而且JavaScript也简单易学,很多前端设计人员可以很快上手做后端设计。

  2、Node.js非阻塞模式的IO处理给Node.js带来在相对低系统资源耗用下的高性能与出众的负载能力,非常适合用作依赖其它IO资源的中间层服务。3、Node.js轻量高效,可以认为是数据密集型分布式部署环境下的实时应用系统的完美解决方案。Node非常适合如下情况:在响应客户端之前,您预计可能有很高的流量,但所需的服务器端逻辑和处理不一定很多。

  Node.js缺点:

  1、可靠性低

  2、单进程,单线程,只支持单核CPU,不能充分的利用多核CPU服务器。一旦这个进程崩掉,那么整个web服务就崩掉了。

  不过以上缺点可以可以通过代码的健壮性来弥补。目前Node.js的网络服务器有以下几种支持多进程的方式:

  #1 开启多个进程,每个进程绑定不同的端口,用反向代理服务器如 Nginx 做负载均衡,好处是我们可以借助强大的 Nginx 做一些过滤检查之类的操作,同时能够实现比较好的均衡策略,但坏处也是显而易见——我们引入了一个间接层。

  #2 多进程绑定在同一个端口侦听。在Node.js中,提供了进程间发送“文件句柄” 的功能,这个功能实在是太有用了(貌似是yahoo 的工程师提交的一个patch) ,不明真相的群众可以看这里: Unix socket magic

  #3 一个进程负责监听、接收连接,然后把接收到的连接平均发送到子进程中去处理。

  在Node.js v0.5.10+ 中,内置了cluster 库,官方宣称直接支持多进程运行方式。Node.js 官方为了让API 接口傻瓜化,用了一些比较tricky的方法,代码也比较绕。这种多进程的方式,不可避免的要牵涉到进程通信、进程管理之类的东西。

  此外,有两个Node.js的module:multi-node 和 cluster ,采用的策略和以上介绍的类似,但使用这些module往往有一些缺点:

  #1 更新不及时

  #2 复杂庞大,往往绑定了很多其他的功能,用户往往被绑架

  #3 遇到问题难以解决

  Node表现出众的典型示例包括:

  1、RESTful API

  提供RESTful API的Web服务接收几个参数,解析它们,组合一个响应,并返回一个响应(通常是较少的文本)给用户。这是适合Node的理想情况,因为您可以构建它来处理数万条连接。它仍然不需要大量逻辑;它本质上只是从某个数据库中查找一些值并将它们组成一个响应。由于响应是少量文本,入站请求也是少量的文本,因此流量不高,一台机器甚至也可以处理最繁忙的公司的API需求。

  2、Twitter队列

  想像一下像Twitter这样的公司,它必须接收tweets并将其写入数据库。实际上,每秒几乎有数千条tweet达到,数据库不可能及时处理高峰时段所需的写入数量。Node成为这个问题的解决方案的重要一环。如您所见,Node能处理数万条入站tweet。它能快速而又轻松地将它们写入一个内存排队机制(例如memcached),另一个单独进程可以从那里将它们写入数据库。Node在这里的角色是迅速收集tweet,并将这个信息传递给另一个负责写入的进程。想象一下另一种设计(常规PHP服务器会自己尝试处理对数据库本身的写入):每个tweet都会在写入数据库时导致一个短暂的延迟,因为数据库调用正在阻塞通道。由于数据库延迟,一台这样设计的机器每秒可能只能处理2000条入站tweet。每秒处理100万条tweet则需要500个服务器。相反,Node能处理每个连接而不会阻塞通道,从而能够捕获尽可能多的tweets。一个能处理50000条tweet的Node机器仅需20台服务器即可。

  3、电子游戏统计数据

  如果您在线玩过《使命召唤》这款游戏,当您查看游戏统计数据时,就会立即意识到一个问题:要生成那种级别的统计数据,必须跟踪海量信息。这样,如果有数百万玩家同时在线玩游戏,而且他们处于游戏中的不同位置,那么很快就会生成海量信息。Node是这种场景的一种很好的解决方案,因为它能采集游戏生成的数据,对数据进行最少的合并,然后对数据进行排队,以便将它们写入数据库。使用整个服务器来跟踪玩家在游戏中发射了多少子弹看起来很愚蠢,如果您使用Apache这样的服务器,可能会有一些有用的限制;但相反,如果您专门使用一个服务器来跟踪一个游戏的所有统计数据,就像使用运行Node的服务器所做的那样,那看起来似乎是一种明智之举。

  总的来说,Node.js的应用场景

  1) 适合

  JSON APIs——构建一个Rest/JSON API服务,Node.js可以充分发挥其非阻塞IO模型以及JavaScript对JSON的功能支持(如JSON.stringfy函数)

  单页面、多Ajax请求应用——如Gmail,前端有大量的异步请求,需要服务后端有极高的响应速度

  基于Node.js开发Unix命令行工具——Node.js可以大量生产子进程,并以流的方式输出,这使得它非常适合做Unix命令行工具

  流式数据——传统的Web应用,通常会将HTTP请求和响应看成是原子事件。而Node.js会充分利用流式数据这个特点,构建非常酷的应用。如实时文件上传系统transloadit

  准实时应用系统——如聊天系统、微博系统,但Javascript是有垃圾回收机制的,这就意味着,系统的响应时间是不平滑的(GC垃圾回收会导致系统这一时刻停止工作)。如果想要构建硬实时应用系统,Erlang是个不错的选择

  2) 不适合

  CPU使用率较重、IO使用率较轻的应用——如视频编码、人工智能等,Node.js的优势无法发挥

  简单Web应用——此类应用的特点是,流量低、物理架构简单,Node.js无法提供像Ruby的Rails或者Python的Django这样强大的框架

  NoSQL + Node.js——如果仅仅是为了追求时髦,且自己对这两门技术还未深入理解的情况下,不要冒险将业务系统搭建在这两个漂亮的名词上,建议使用MySQL之类的传统数据库

  如果系统可以匹配Node.js的适用场景,那么是时候采取具体的措施来说服老板了。

  说服自己老板采用Node.js的方式

  构建一个简单的原型——花一周时间构建系统某一部分的原型是非常值得的,同时也很容易和老板在某一点达成一致,等到系统真的在某一部分应用了Node.js,就是打开局面的时候

  寻找开发者——首先JavaScript语言的普及度很高,一般公司都不乏Web前端工程师,而此类工程师的学习门槛也非常低。这就意味着Node.js很容易招人,或者公司就隐藏了一些高手

  强大的社区支持——Node.js社区非常活跃,吸引很多优秀的工程师,这就意味着公司可以很容易从社区得到免费或者付费的支持

  系统性能考虑——JavaScript引擎Google V8,加之原生异步IO模型,使得Node.js在性能的表现非常出色,处理数以千计的并发请求非常轻松

  专业公司的支持——使用开源技术的最大问题是,原作者不承诺对其产品进行技术支持或者质量保证。现在Node.js已经得到Joyent公司的赞助,这就保证了未来Node.js的发展是可持续性的

  参考文档:

  1. 浅谈Node.js的工作原理及优缺点

  2. Node.js优缺点

  3. NodeJs 多核多进程并行框架实作

  4. Flexi传授如何说服自己的老板采用Node.js

  风起亚洲云:香港联科集团旗下 基于Joyent技术的风起亚洲云充分发挥了Node.js的优势,从而降低了云平台的CPU功耗,增加容量和扩展性。如果您有兴趣,请点击:風起亞洲
使用道具 举报

回复

发表于 2015-7-30 23:20:30 | 显示全部楼层
  Node.js 的优势是「高并发」,所以很适合用来做 IO 调度,但不太适合用来做复杂计算。

  Yahoo 在使用 Node.js,并且已经有了自己的 Node.js 云服务,使用起来类似于 Heroku 或 Google AppEngine——上传应用的源代码,云端自动处理好依赖关系,然后分配适当的资源来运行。Yahoo 使用的方式也很明确,后端真正复杂的逻辑不会用 Node.js 来写,而是 C++ 写好的 JSON API 接口。当来自 Internet 的请求来到 Node.js 时,Node.js 处理部分业务逻辑,但不做复杂计算,将业务逻辑分解为后端 JSON API 调用能解决的问题,然后发起调用。Node.js 的优势在于这些 JSON API 调用都是异步的,等待返回期间不占用任何资源,所以 Node.js 作为前端服务器能够承载更高的并发度。

  如果个性化服务是一种趋势,那么 Node.js 高并发的优势就比较明显。个性化服务使得内容数据不能在前端服务器做缓存,因为每个人看到的都不一样。这时候前端服务器就必须处理每一个请求,但后端数据计算则可以并行地做,让用户感觉不到明显延时。
使用道具 举报

回复

发表于 2015-7-31 02:09:02 | 显示全部楼层
我用 Node.js 开发了 Am I Hacked,算是有一点用 Node.js 支持大流量的经验。先列一些数字
  • 服务器是 Linode 512,也就是 Linode 上最低端的 VPS ,只有 512MB 的内存。
  • 数据库,Node.js 程序和静态文件都放在同一台服务器上。
  • 大部分查询耗时 20-100ms 。少数查询由于缓存 miss 较多,耗时会高达500ms。
  • 最高日PV超过了一百万,Google Analytic 上显示的同时在线人数最高达2000。
  • 平均每秒能完成20-30次查询,瓶颈在磁盘IO,CPU几乎无压力。
  • 虽然压力如此之大,首页几乎都能在一秒内打开,查询也会在3秒内返回。
  • Node.js 程序占用内存 90MB-110MB,剩余内存都被磁盘缓存占据。以我的了解,Python 和 Ruby 上的非 Event Driven 的 Framework 根本不可能达到这样的性能。
    然后说说 Node.js 的其他优点
  • Node.js 的架构与 Django, Rails 等传统的 Framework 不同,不需要放在 Nginx / Apache 后,利用 WSGI, CGI 之类的接口一板一眼的 [接受Request] -> [运行程序逻辑] -> [生成并返回Response]。这是一个巨大的变化,之前一些无法想象的功能都有可能实现了。比如 https://github.com/Miserlou/DirtyShare 可以用浏览器实现 P2P 的文件传输。正因为 Node.js 可以更精细的控制 Request 和 Response 的时间和内容,websocket 似乎天生就是为 Node.js 而生的,而配合 http://socket.io 这个神奇的库之后,在 realtime webapp 这个领域,Node.js 已经没有对手了。
  • Node.js 的包管理器 npm 设计得比 python 和 ruby 好很多。有很多的 module 开发者。当然也有一些缺点
  • Debug 很困难。没有 stack trace,出了问题很难查找问题的原因。
  • 如果设计不好,很容易让代码充满 callback 。实在受不了的可以考虑一下 https://github.com/laverdet/node-fibers/ 这个项目。不过 Node.js 的核心团队并不推荐使用。
    有没有大公司使用?
  • LinkedIn Mobile 的 服务器端完全是用 Node.js 写的。
  • Yahoo 有一部分新项目使用了 Node.js。
  • 阿里巴巴内部也有一些新项目用到了 Node.js。
  • 使用道具 举报

    回复

    发表于 2015-7-31 04:07:59 | 显示全部楼层
    优点:
    1. 异步事件驱动,单进程线程,占用服务器资源少,高并发支持好,虽然单进程,但可以通过官方的 cluster 模块开启多个实例充分利用多核CPU的优势. 节约了服务器的资源,同时又能达到理想的状态
    2. 入门简单,非常适合做 单页程序 + RESTfull API,Worktile就是采用Angular JS + Node.js实现的SPA,基本上完美配合。
    3. 我觉得Node.js也非常适合动态网页web开发,虽然官方没有提供像Apache 和 Tomcat 这样的网页服务器和JSP这样的动态创建网页的技术,但是有很多优秀的第三方模块可以使用, 用 express mvc框架 加上你喜欢的模板引擎(ejs,jade,dot ),感觉还是很棒的
    缺点:
    1. 异步编程的缺点往往就是到处callback,代码不优雅,但是可以通过一些第三方的同步模式的模块进行弥补
    2. 不适合做企业级应用开发,特别是复杂业务逻辑的,代码不好维护,事务支持不是很好。
    有人说debug成本高,这要取决于你使用什么开发工具了,推荐webstorm,可以对Node.js程序进行单步调试
    另外,Node.js也可以独立做操作复杂的后台服务,所以想怎么玩就怎么玩,一切代码尽在你的手中,我也是今年刚接触Node.js,入门快 简单 带给我的是惊喜。每种开发语言都有他的优势和劣势,作为码农,强烈建议没事学学Node.js,我公司的产品 Worktile 让工作更简单 就是采用Node.js 开发的,性能和稳定性都还不错
    使用道具 举报

    回复

    发表于 2015-7-31 06:19:23 | 显示全部楼层
      我们正在用 node.js 开发系统。系统架构和肉饼同学描述的一模一样:

      前端 javascript / app+JSONAPI+node后端。

      到目前为止的感觉是:

      好的部分

      1,统一语言。整个 team 里除了我,都是刚毕业(当然有个学习曲线了,但过了就好了),现在所有人前后端通吃,有问题谁都能从前端一直追到数据库。

      2,统一模型。如果你已经习惯异步和回调,那么配合 redis/mq 之类的设施,思考起来会很一致。

      3,社区活跃。各种包,几乎所有能想得到的需求,都有人做了包出来 npm 一装就好。

      不好的部分

      1,有的包成熟度不高,有时需要 debug 包的内部问题,已经碰到好几回,好在都是开源的,虽说费点劲,但大多都能解决。

      2,容易写出糟糕的代码,callback 的执行流程有时并不是很符合直觉,需要定期 review 和重构来加以避免。

      另外,澄清一下

      单线程,tcp,这些是常规误解,在 node 0.8 以上版本已经都不是问题。此外,我个人并不认为 node 不适合做 web 开发,虽然现在架构的趋势是比较偏向于 thin json api,但 express 框架确实也能很好地(而且很漂亮)解决上述诸如:路由、缓存、中间件、cookie、session、template 之类的 web 典型问题。

      至于是否面向对象,我觉得和代码的组织没有关系。node 提供了完备的 pacakge 机制。代码组织不是问题。
    使用道具 举报

    回复

    发表于 2015-7-31 07:36:25 | 显示全部楼层
    Shelton在BigBang 3x13是这样说的——Windows 7 is much more user-friendly than Windows Vista… I don't like that!
    如果你们公司里有很多小白,那还是看看.Net或Java吧。
    如果你们公司里有很多大牛,千万别提Node.js,否则你拦都拦不住。
    使用道具 举报

    回复

    发表于 2015-7-31 08:54:08 | 显示全部楼层
    up
    使用道具 举报

    回复

    发表于 2015-7-31 09:58:12 | 显示全部楼层
    都看别人说这么多了,还不如开启自己人生的第一个node进程
    使用道具 举报

    回复

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    关于我们
    联系我们
    • 电话:010-86393388
    • 邮件:udn@yonyou.com
    • 地址:北京市海淀区北清路68号
    移动客户端下载
    关注我们
    • 微信公众号:yonyouudn
    • 扫描右侧二维码关注我们
    • 专注企业互联网的技术社区
    版权所有:用友网络科技股份有限公司82041 京ICP备05007539号-11 京公网网备安1101080209224 Powered by Discuz!
    快速回复 返回列表 返回顶部