您好,欢迎访问三七文档
当前位置:首页 > 法律文献 > 理论/案例 > NodeJS优缺点及适用场景讨论
NodeJS优缺点及适用场景讨论前端开发程序猿2013年12月12日概述:NodeJS宣称其目标是“旨在提供一种简单的构建可伸缩网络程序的方法”,那么它的出现是为了解决什么问题呢,它有什么优缺点以及它适用于什么场景呢?本文就个人使用经验对这些问题进行探讨。一.NodeJS的特点我们先来看看NodeJS官网上的介绍:Node.jsisaplatformbuiltonChrome’sJavaScriptruntimeforeasilybuildingfast,scalablenetworkapplications.Node.jsusesanevent-driven,non-blockingI/Omodelthatmakesitlightweightandefficient,perfectfordata-intensivereal-timeapplicationsthatrunacrossdistributeddevices.其特点为:1.它是一个Javascript运行环境2.依赖于ChromeV8引擎进行代码解释3.事件驱动4.非阻塞I/O5.轻量、可伸缩,适于实时数据交互应用6.单进程,单线程二.NodeJS带来的对系统瓶颈的解决方案它的出现确实能为我们解决现实当中系统瓶颈提供了新的思路和方案,下面我们看看它能解决什么问题。1.并发连接举个例子,想象一个场景,我们在银行排队办理业务,我们看看下面两个模型。(1)系统线程模型:这种模型的问题显而易见,服务端只有一个线程,并发请求(用户)到达只能处理一个,其余的要先等待,这就是阻塞,正在享受服务的请求阻塞后面的请求了。(2)多线程、线程池模型:这个模型已经比上一个有所进步,它调节服务端线程的数量来提高对并发请求的接收和响应,但并发量高的时候,请求仍然需要等待,它有个更严重的问题。到代码层面上来讲,我们看看客户端请求与服务端通讯的过程:服务端与客户端每建立一个连接,都要为这个连接分配一套配套的资源,主要体现为系统内存资源,以PHP为例,维护一个连接可能需要20M的内存。这就是为什么一般并发量一大,就需要多开服务器。那么NodeJS是怎么解决这个问题的呢?我们来看另外一个模型,想象一下我们在快餐店点餐吃饭的场景。(3)异步、事件驱动模型我们同样是要发起请求,等待服务器端响应;但是与银行例子不同的是,这次我们点完餐后拿到了一个号码,拿到号码,我们往往会在位置上等待,而在我们后面的请求会继续得到处理,同样是拿了一个号码然后到一旁等待,接待员能一直进行处理。等到饭菜做号了,会喊号码,我们拿到了自己的饭菜,进行后续的处理(吃饭)。这个喊号码的动作在NodeJS中叫做回调(Callback),能在事件(烧菜,I/O)处理完成后继续执行后面的逻辑(吃饭),这体现了NodeJS的显著特点,异步机制、事件驱动整个过程没有阻塞新用户的连接(点餐),也不需要维护已经点餐的用户与厨师的连接。基于这样的机制,理论上陆续有用户请求连接,NodeJS都可以进行响应,因此NodeJS能支持比Java、PHP程序更高的并发量虽然维护事件队列也需要成本,再由于NodeJS是单线程,事件队列越长,得到响应的时间就越长,并发量上去还是会力不从心。总结一下NodeJS是怎么解决并发连接这个问题的:更改连接到服务器的方式,每个连接发射(emit)一个在NodeJS引擎进程中运行的事件(Event),放进事件队列当中,而不是为每个连接生成一个新的OS线程(并为其分配一些配套内存)。2.I/O阻塞NodeJS解决的另外一个问题是I/O阻塞,看看这样的业务场景:需要从多个数据源拉取数据,然后进行处理。(1)串行获取数据,这是我们一般的解决方案,以PHP为例假如获取profile和timeline操作各需要1S,那么串行获取就需要2S。(2)NodeJS非阻塞I/O,发射/监听事件来控制执行过程NodeJS遇到I/O事件会创建一个线程去执行,然后主线程会继续往下执行的,因此,拿profile的动作触发一个I/O事件,马上就会执行拿timeline的动作,两个动作并行执行,假如各需要1S,那么总的时间也就是1S。它们的I/O操作执行完成后,发射一个事件,profile和timeline,事件代理接收后继续往下执行后面的逻辑,这就是NodeJS非阻塞I/O的特点。总结一下:Java、PHP也有办法实现并行请求(子线程),但NodeJS通过回调函数(Callback)和异步机制会做得很自然。三.NodeJS的优缺点优点:1.高并发(最重要的优点)2.适合I/O密集型应用缺点:1.不适合CPU密集型应用;CPU密集型应用给Node带来的挑战主要是:由于JavaScript单线程的原因,如果有长时间运行的计算(比如大循环),将会导致CPU时间片不能释放,使得后续I/O无法发起;解决方案:分解大型运算任务为多个小任务,使得运算能够适时释放,不阻塞I/O调用的发起;2.只支持单核CPU,不能充分利用CPU3.可靠性低,一旦代码某个环节崩溃,整个系统都崩溃原因:单进程,单线程解决方案:(1)Nnigx反向代理,负载均衡,开多个进程,绑定多个端口;(2)开多个进程监听同一个端口,使用cluster模块;4.开源组件库质量参差不齐,更新快,向下不兼容5.Debug不方便,错误没有stacktrace四.适合NodeJS的场景1.RESTfulAPI这是NodeJS最理想的应用场景,可以处理数万条连接,本身没有太多的逻辑,只需要请求API,组织数据进行返回即可。它本质上只是从某个数据库中查找一些值并将它们组成一个响应。由于响应是少量文本,入站请求也是少量的文本,因此流量不高,一台机器甚至也可以处理最繁忙的公司的API需求。2.统一Web应用的UI层目前MVC的架构,在某种意义上来说,Web开发有两个UI层,一个是在浏览器里面我们最终看到的,另一个在server端,负责生成和拼接页面。不讨论这种架构是好是坏,但是有另外一种实践,面向服务的架构,更好的做前后端的依赖分离。如果所有的关键业务逻辑都封装成REST调用,就意味着在上层只需要考虑如何用这些REST接口构建具体的应用。那些后端程序员们根本不操心具体数据是如何从一个页面传递到另一个页面的,他们也不用管用户数据更新是通过Ajax异步获取的还是通过刷新页面。3.大量Ajax请求的应用例如个性化应用,每个用户看到的页面都不一样,缓存失效,需要在页面加载的时候发起Ajax请求,NodeJS能响应大量的并发请求。总而言之,NodeJS适合运用在高并发、I/O密集、少量业务逻辑的场景。五.结尾其实NodeJS能实现几乎一切的应用,我们考虑的点只是适不适合用它来做。关于Node.js不得不说的事儿发表于:Web前端|作者:ryan|目前已阅读:8,031次标签:Node.js自从诞生之后就引起了广大web前端开发同学的关注,且很快成为开源分享站点github.com最热门的话题之一。同时国内越来越多的技术沙龙里出现Node.js的身影,也有越来越多的团队开始在生产系统上使用Node.js。但正如《人月神话》作者所说的一样”NoSilverBullet”,软件开发没有银弹,适当的技术适当做适当的事情。下面我们来看下Node.js于我们来说应该持怎样的态度。Node.js到底是什么?Node.js不是一个新的开发语言,而是开发语言(JavaScript)的一个运行环境。通俗的说就是原来只是跑在浏览器里的JavaScript可以跑在你的PC,你的Mac,甚至你的Web服务器上了。Node.js官网()对其介绍足够简单明了:Node.js是基于Chrome的JS运行环境,用来方便地构建高效的、可扩展的网络应用。由于采用事件驱动和无阻塞模型,使得Node.js对跨平台的资源密集型实时应用有更轻量、高效和完美的支持。但是如果单单是把JavaScript运行环境(ChromeV8引擎)放到Windows或Linux平台其实是没有太大意义的,因为JavaScript在浏览器里的部分魅力在于DOM,BOM操作。同时Javascript在浏览器上的发挥严重受限于跨域,安全,本地限制等各种约束。Node.js提供的环境刚刚相反,减掉DOM和BOM等支持,增加了文件系统、进程管理、事件驱动(类似DOM上的)、util工具集和HTTP服务等各种强大的功能。于是,Node.js具备了其他开发语言所具备的能力。被困在浏览器里的这头野兽,被放养了。哪些人在用Node.js?一类是生产系统,直接或间接的面向互联网用户的,举例如下:朋友网长链接聊天服务花瓣网整站Node.js开发+Express框架新浪网Node.js做MySQL中间层阿里淘宝指数、数据魔方等及中间层搜狐小纸条等Linkedin移动服务Stackvm虚拟机服务雅虎邮箱开发微软win8相关joyent云服务一类是工具集,提升研发效率和方法:这个就不胜枚举了。可以毫不夸张的说,几乎所有的称得上名字的互联网公司都有在使用。Node.js优势和劣势下面主要从语言的特点,开发的成本,功能特点的一些角度来简单做一个划分:优势原因1异步的I/O模型这个应该是Node.js做生产系统最大的优势,也是官方主打的特性。在实时聊天、IO密集、服务(数据库)调用阻塞等问题上,JS的异步模式有天然优势。举例:C++代码JavaScript代码2语言优势JavaScript本身语言入门门槛低,且在互联网时代下有大量的web前端开发同学(熟练使用JavaScript、熟悉其语言特性,同时这批同学对HTTP协议有着深入的理解),他们不需要学习新的语言即可以涉猎server开发。这使得新兴创业公司及一些前端相对强势的大公司,在生产系统上都有了不俗的表现。3活跃的社区、群体和模块化Node.js社区在以疯狂的速度发展,github上的项目也层出不穷。使用Node.js的都是具备一定产品意识和外向性格的群里,这使得基于Node.js的新的idea在媒体上屡屡曝光。Node.js提供了非常便利的模块管理模式(npm工具),大大降低了模块耦合的成本。同时,基于node.js的工具模块在跨平台web前端开发过程中,体现出了绝大的价值。比如:grunt代码整合,前端代码预编译等。能力当然我们也要看到Node.js的劣势和问题所在:缺点原因1稳定性上有所欠缺毕竟,Node.js是新生产物,在它赶超其他热门语言的过程需要时间和成长。目前最让人头痛的一个问题是,Node.js在升级过程中,经常会导致开发者基于老版本开发的代码无法直接使用。这个是在pomleo(网易游戏开发框架)和朋友网长链接聊天server研发过程中都遇到过的问题。(当然可以通过不升级和适配的方式解决)2不太适合敏捷web开发或大型复杂web开发如果你或你的团队熟悉php,java等web开发语言,那么不建议使用Node.js作为项目开发首选。比如我们内部的管理系统,敏捷开发调试会选择php;海量的生产系统会选择C++。这里举一个很简单的例子。php和node.js的helloworld。php代码Node.js代码这个看上去还好,但是当你需要对一个静态资源进行cache的时候,php或java等依赖webserver的可以默认实现且简单配置可以处理,但是对于node.js就惨了。你需要逐条编写代码实现HTTP协议上的功能,重复造轮子。Node.js的开发成本除了语言特性上的便捷以外,其他逻辑开发和C/C++几乎是一样的。代码如下:这搞起来是不是很蛋疼。当然也有一些解决方案,比如使用express等框架,但是这里问题还是会存在。毕竟Node.js还在成长,对于很多问题可能都还没有人解决,那么就需要使用Node.js对基础应用和网络知识有较深入的理解,且对研发效率有所影响。好了,上面两个劣势已经使得我们在选型过程中需要足够的慎重,但是也不能因噎废食嘛。
本文标题:NodeJS优缺点及适用场景讨论
链接地址:https://www.777doc.com/doc-2889782 .html