Node.js特色和适用场景

Node 起源

Node是由Ryan Dahl创造出来的,Ryan Dahl是一名资深的C/C++程序员,在创造出Node以前,他的主要工做都是围绕高性能web服务器来展开的,他找到了设计高性能web服务器的几个要点:事件驱动、非阻塞I/O,基于对已有的几种语言的对比和考量,Ryan Dahl选择了JavaScript做为Node的实现语言。前端

Node特色

1.异步I/O
在Node中,绝大多数的操做都以异步的方式进行调用,从文件读取到网络请求,均是如此,异步I/O意味着每一个调用之间无须等待以前的I/O调用结束,在编程模型上能够提高效率,若是存在两个文件读取任务,最终的耗时只取决于最慢的那个文件读取耗时,对于同步I/O而言,他的耗时是两个任务之和。程序员

2.事件与回调
在Node中事件获得了普遍的应用,如建立一个服务器,咱们会为器其绑定request对象,对于请求对象绑定data和end事件,同时在前端咱们一般也是为Ajax请求绑定success事件、error事件等。一样,在Node中回调也是无处不在的,事件的处理基本都是依赖回调来实现的,在JavaScript中,能够将函数做为对象传递给方法做为实参进行调用。web

3.单线程
Node保持了JavaScript在浏览器中单线程的特色,并且在Node中,JavaScript与其他线程是没法共享任何状态的。JavaScript采用单线程的缘由和他最先的用途有关,最先在Web浏览器中,JavaScript主要作的是响应用户DOM操做以及作表单校验,这些功能使用单线程来处理彻底够了,并且对于DOM操做来讲,使用多线程的话还将形成线程安全问题,同时多线程还将给浏览器带来更大的内存消耗并下降CPU的使用率。编程

单就单线程自己来讲,存在以下几个弱点:浏览器

一、没法利用多核CPU
二、错误会引发整个应用退出,应用的健壮性须要考虑
三、大量计算占用CPU将使阻塞程序的运行
严格来讲,Node并不是真正的单线程架构,Node自身还有必定的I/O线程存在,这些I/O线程由底层libuv处理,这就意味着Node在访问系统I/O时仍是多线程的,对于文件读取、SQL查询、网路请求这些具体操做,Node仍是使用多线程来进行处理从而保证Node的处理效率。安全

为了应对单线程存在的CPU利用率问题,Node采用了多进程的架构,也就是著名的Master-Worker模式,又称主从模式,以下图所示,这种典型的用于并行处理业务的分布式架构具备较好的伸缩性和稳定性。Node经过fork()复制的进程都是一个个独立的进程,这个进程中有着独立的V8实例,每一个独立进程须要至少30毫秒的启动时间和至少10MB的内存,虽然fork()进程是有必定开销的,可是能够提升多核CPU的利用率,这在CPU广泛多核化的今天仍是有很大的做用的,同时咱们也应该认识到Node经过事件驱动的方式在单线程上已经能够解决大并发的问题,启动多进程只是为充分利用CPU资源。服务器

图片描述

Node的Master-Worker多进程模式中主进程和工做进程经过消息传递的形式而不是共享或直接操做资源的方式进行通讯,经过fork()建立工做进程以后会在主进程和工做进程之间建立IPC通道,关于多进程相关内容,Node官方提供了cluster模块对进程进行管理,相关内容可参考cluster。网络

关于应用的健壮性问题,咱们一样能够采用上述的Master-Worker模式,主进程只负责管理工做进程,具体的业务处理交由工做进程来完成,在工做进程中监听uncaughtException事件能够捕获未知的异常,而后告知主进程,主进程根据策略从新建立工做进程,或者直接退出主进程,这种状况代码中必定要给出足够的日志信息,经过日志监控任务及时产生报警。多线程

4.跨平台
Node刚发布的时候,只能在Linux平台上运行,后来Node在架构层面进行了改动,在Node和操做系统之间引入了一层libuv,从而实现跨平台。架构

Node适合的应用场景

1.I/O密集型
Node异步I/O的特色使得他能够轻松面对I/O密集型的业务场景,处理效率将比同步I/O高,虽然同步I/O能够采用多线程或者多进程的方式进行,可是相比Node自带异步I/O的特性来讲,将增长对内存和CPU的开销。

2.高并发场景
针对高并发请求场景,Node的异步I/O以及事件回调特色能够高效的处理并发请求,举个简单的例子:

有家快餐店,有一个收银员,有4个厨师,中午高峰期的时候回一下来不少人就餐,对于同步的场景,收银员收完钱后将订单给厨师,厨师开始作,作完以后把快餐交给顾客,而后再接受下一个顾客的订单,对于异步的场景,收银员收完钱后将订单给厨师同时给顾客一个号码牌,厨师开始作,这时候顾客能够去隔壁买个饮料,等到厨师作完叫好去取餐就行。对于同步的场景若是须要增长顾客的处理速度,须要多加几个收银员(多线程),这意味着须要更多的人力成本,虽然对于系统的处理能力(厨师)来讲是同样的。

总结

整体来讲Node的异步I/O能在开销固定的状况下极大的提升并发处理速度,适合高并发,I/O密集型的使用场景,同时因为单线程的特色,Node程序不如多线程程序健壮性高,也不能利用多线程来使用多核CPU,不过对于Node来讲,使用多进程的成本相对较小,上述问题均可以经过合理使用多进程来处理,最终程序的高效稳定运行仍是取决于软件架构和编码质量。为了便于学习,接下来还会写关于Node中Buffer、内存控制、程序测试等相关内容。

相关文章
相关标签/搜索