`

Node.js优缺点

阅读更多
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官网解释是Evented I/O for
V8 JavaScript。Evented IO实际上单线程epoll/kqueue模型,简单来说就是比select和poll等效率更高的事件驱动模型;而单线程主要是为了减少locking的开销。这两点使得node.js能够同时处理大量的高并发链接(这种模型与nginx,redis以及haproxy的结构也比较类似)。
至于V8,则是相当出色的Javascript引擎,好处是熟悉的人多,人力成本低,开发效率高,同时不失语言的运行效率。

要讲清楚这个问题,先讲讲整个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 开启多个进程,每个进程绑定不同的端口,用反向代理服务器如 Nginx 做负载均衡,好处是我们可以借助强大的 Nginx 做一些过滤检查之类的操作,同时能够实现比较好的均衡策略,但坏处也是显而易见——我们引入了一个间接层。
#2 多进程绑定在同一个端口侦听。在Node.js中,提供了进程间发送“文件句柄” 的功能,这个功能实在是太有用了(貌似是yahoo 的工程师提交的一个patch)
#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的发展是可持续性的
分享到:
评论

相关推荐

    node.js-study:Node.js研究

    Node.js网络应用程序了解每个Node.js网络应用程序和现有网络应用程序的特征,优缺点,以及这两种方法之间的差异。 参考链接: : 现有网络应用网络I / O以基于线程的同步方法处理。 多线程网络应用程序。基于线程的...

    Node.JS第一章简介介绍

    Node.js是基于Chrome JavaScript运行时建立的一个平台,实际上它是对Google Chrome V8引擎进行了封装;该文档介绍从javascirpt、V8、优缺点、涉及领域、知识点,阐述了Node.js的开发涉及到领域和潜力。

    Node.js 多进程处理CPU密集任务的实现

    但缺点也很明显,由于 Node.js 是单线程程序,如果长时间运算,会导致 CPU 不能及时释放,所以并不适合 CPU 密集型应用。 当然,也不是没有办法解决这个问题。虽然 Node.js 不支持多线程,但是可创建多子进程来执行...

    Node.js 对比 Python:优点、缺点和用例(csdn)————程序.pdf

    Node.js 对比 Python:优点、缺点和用例(csdn)————程序

    什么是Node.js?Node.js详细介绍

    主要介绍了什么是Node.js,Node.js能做什么,Node.js的优缺点,Node.js的例子等,需要的朋友可以参考下

    极简MapReduce框架Mincemeat-node.zip

    Mincemeat-node 是使用Node.js实现的极简MapReduce框架,可以快速的部署投入工作,免去Hadoop繁琐的配置,享受随心大数据。Mincemeatpy实现的是一种非常简单的MapReduce模型,仅仅实现了任务的分布计算,并没有类似...

    Node.js 和 Python之间该选择哪个?

    最近,Node.js 和 Python 都因其广泛的特性和功能在市场上大受欢迎。在你开发Web应用程序的...用一种简单易懂的语言来说,Node.js是一个服务器端平台,它是在Google Chrome的JavaScript引擎(称为V8引擎)上开发的。Nod

    基于Node.Js的Markdown博客系统Liblog.zip

    Liblog是一个简单易用的Markdown博客系统,它是基于开源框架thinkJS(使用 ES6/7 特性开发 Node.js 框架)开发的nodejs项目 需要mysql数据库支持,具有管理后台功能,更新博客分为普通文章和markdown文章,markdown...

    浅析Node.js 中 Stream API 的使用

    本文由浅入深给大家介绍node.js stream api,具体详情请看下文吧。 基本介绍 在 Node.js 中,读取文件的方式有两种,一种是用 fs.readFile ,另外一种是利用 fs.createReadStream 来读取。 fs.readFile 对于每个 ...

    node-red:节点红色试验,可能不适合任何目的

    节点红色Node-Red 节点直接处理来自 ..."mac":"c9:xx:xx:c7:aa:cb"} 节点版本按照下面的安装说明,它将与 Node.js 一起使用直到 v12RuuviTag 节点关于侦听 node-red-contrib-noble 消息或 Ruuvi Gateway MQTT 消息

    cache_redis_node:在Redis,Mongo和Node.js中使用Cache的示例

    在每种情况下缓存的优缺点 使用缓存即服务 雷迪斯 比较Redis和Memcached 安装和使用Redis和Node.js进行缓存 切割中间件用于快递 创建一个PUB / SUB以删除旧的缓存 介绍 当前,Node.js中有多个API可以处理大量事务,...

    geotiff.js:geotiff.js是一个小型库,用于解析TIFF文件以进行可视化或分析。 它用纯JavaScript编写,可在浏览器和node.js应用程序中使用

    geotiff.js 从各种不同的(Geo)TIFF文件类型中读取(地理空间)元数据和原始数组数据。 特征 当前可用的功能: 解析来自各种来源的TIFF: 远程(通过fetch或XHR) 从本地ArrayBuffer 从文件系统(在使用...

    Node.js 的异步 IO 性能探讨

    Python 和 Ruby 也有这样的框架,但因为在实际使用中会不可避免地用到含有同步代码的库,因此没能成长起来,而在 Node.js 之前,JavaScript 的服务器端编程几乎是空白,所以 Node.js 才得以建立起了一个所有 IO 均为...

    Node.js配合node-http-proxy解决本地开发ajax跨域问题

    1. 后端接口打包到本地运行(缺点:每次后端更新都要去测试服下一个更新包,还要在本地搭建java运行环境,麻烦) 2. CORS跨域:后端接口在返回的时候,在header中加入’Access-Control-Allow-origin’:* 之类的(有...

    详解在Node.js中发起HTTP请求的5种方法

    在Node.js中有相当多的解决方案,其中有语言内置功能,也有开源社区贡献的开发库。下面咱们来看一下比较流行的几种方式。 在开始之前,请先在自己的计算机上安装最新版的node.js和npm。 HTTP – 标准库 首先是标准...

    magick-cli:适用于Node.js的本机ImageMagick CLI

    这是从节点开始使用某些库的好方法,但是存在以下缺点: 性能-与直接从Node.js环境中调用库C或C ++ API相比,对shell命令的调用花费更多的时间和更多的资源。 错误处理程序-有时您无法以正确的方式拦截和处理错误。...

    node环境编译工具-npm

    nodejs环境(包括Vuejs、node.js前端工程等)编译工具

    markdownlint:用于MarkdownCommonMark文件的Node.js样式检查器和lint工具

    markdownlint 用于Markdown / CommonMark文件的Node.js样式检查器和lint工具。安装npm install markdownlint --save-dev总览标记语言旨在易于阅读,编写和理解。 它成功了-它的灵活性既是优点也是缺点。 可能有多种...

    node-configure:一个简单的用于node.js的多配置管理模块

    有几个可用于node.js的配置模块。 每种方法都有其优点和缺点,但是没有一个项目可以视为所有用例的最佳配置选项。 某些应用程序需要复杂的配置,可以从中央服务器获取。 其他人只想在应用启动时加载一个简单的JSON...

    Node.js编写组件的三种实现方式

    支持为python、lua、js等多种常见脚本语言生成C++组件包装代码,swig使用者只需要编写C++代码和swig配置文件即可开发各种脚本语言的C++组件,不需要了解各种脚本语言的组件开发框架,缺点是不支持javascript的回调,...

Global site tag (gtag.js) - Google Analytics