您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 电子设计/PCB > NodeJS的特点概述
NodeJS的特点概述: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能实现几乎一切的应用我们考虑的点只是适不适合用它来做六.参考文献[1]Node.js能构建支持并发和高负载的大型应用吗?[2]理解Node.js事件驱动编程[3]是否不擅长CPU密集型业务[4]使用Node.js的优势和劣势都有哪些?有大公司用吗?[5]Node.js给前端带来了什么使用Node.js的优势和劣势都有哪些?有大公司用吗?3条评论分享按投票排序按时间排序37个回答什么是答案总结?答案总结赞同86反对,不会显示你的姓名收起匿名用户知乎用户、钟汉津、eaminhu等人赞同我们在用Node.js处理知乎主站的web实时推送。你现在看到的Feed、消息的实时更新,背后就是几个node进程扛起来的。优点:1.处理高并发场景性能更高在用socket.io之前,推送服务是用ajaxpolling做的。我们用Tornado和Node.js做过两个版本的推送服务。在当时的测试环境下,Node.js的CPU时间是Tornado的三分之一,内存使用是Tornado的一半,代码行数只有Tornado的三分之一(Node.js版是用coffee写的)。后来我们使用了socket.io,CPU开销进一步降低。2.函数式编程非常适合写异步回调链用Node.js配合CoffeeScript写异步操作链非常便利,相比之下Tornado无论是写命名函数的回调,还是yield一个Task都没那么自然。缺点:1.大量匿名函数使异常栈变得不好看。2.无法以request为单位catch异常,必须确保不要在不catch异常的第三方库的回调里的抛异常,这在一个异步操作链条里是一件比较麻烦的事。解决方法之一是对那些不catch异常的第三方库做一些封装,把所有的异常变成事件,改成on('error')形式的API。编辑于2014-03-1117条评论感谢分享收藏•没有帮助•举报赞同170反对,不会显示你的姓名FengqiAsia,香港联科集团旗下公有云收起总有刁民想害寡人、VincentWeiss、AndersonAranya等人赞同先回答第二个问题吧。Node.js其实有很多大公司都在用的,比如eBay,Microsoft,你可以去Node.js官网看看:node.js要想知道更详细的列表,可以看这里:再稍微花点时间,搜集一些网上资料回答第一个问题:优势和劣势。要讲清楚这个问题,先讲讲整个Web应用程序架构(包括流量、处理器速度和内存速度)中的瓶颈。瓶颈在于服务器能够处理的并发连接的最大数量。Node.js解决这个问题的方法是:更改连接到服务器的方式。每个连接发射一个在Node.js引擎的进程中运行的事件,而不是为每个连接生成一个新的OS线程(并为其分配一些配套内存)。Node.js不会死锁,因为它根本不允许使用锁,它不会直接阻塞I/O调用。Node.js还宣称,运行它的服务器能支持数万个并发连接。Node本身运行V8JavaScript。V8JavaScript引擎是Google用于其Chrome浏览器的底层JavaScript引擎。Google使用V8创建了一个用C++编写的超快解释器,该解释器拥有另一个独特特征:您可以下载该引擎并将其嵌入任何应用程序。V8JavaScript引擎并不仅限于在一个浏览器中运行。因此,Node.js实际上会使用Google编写的V8JavaScript引擎,并将其重建为可在服务器上使用。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),不明真相的群众可以看这里:Unixsocketmagic#3一个进程负责监听、接收连接,然后把接收到的连接平均发送到子进程中去处理。在Node.jsv0.5.10+中,内置了cluster库,官方宣称直接支持多进程运行方式。Node.js官方为了让API接口傻瓜化,用了一些比较tricky的方法,代码也比较绕。这种多进程的方式,不可避免的要牵涉到进程通信、进程管理
本文标题:NodeJS的特点概述
链接地址:https://www.777doc.com/doc-4503742 .html