NodeJS学习

NodeJs是一种用JavaScript编写,运行在Google V8引擎的服务端程序,在2009年出来,在经历过几个版本后,如今已经被运用在某些特定的地方,好比网站先后端分离,聊天室等。程序员

在看NodeJS的一些介绍的时候,常常会看到高并发和高性能两个词,这里看一下为何会高并发和高性能:编程

 1. NodeJS对于一个请求,再也不是建立一个线程,因此这就减小了建立线程带来的性能损耗,性能就能够上去,同时也避免了OS底层对进程内线程数的限制,并发就能够上去。 后端

 2. NodeJS内部是基于事件循环的,并且是基于异步IO的,因此避免了CPU的上下文切换,一样解决的系能损耗,服务器

可是这里要注意一个问题:网络

1. NodeJS进程并非真正意义的单线程,好比一个NodeJS请求,要进行网络访问,并将相应内容写入到磁盘,实际上是有3个IO线程,1是一个http请求的IO线程,一个是网络访问的IO线程,还有一个是磁盘IO线程。 NodeJS的线程模型能够理解为一个工做线程,多个IO线程。 并发

下面是NodeJs的结构图:前后端分离

其中Libuv是一个适配层,主要针对*nix和Windows下异步IO的适配,进程间通讯的适配。异步

看NodeJs的介绍,常常看到的就是异步, 这里的异步本质就是操做系统的异步,因此这里理解了操做系统的异步,也就理解了NodeJS的异步,关于同步,异步,阻塞和非阻塞,能够参考 http://bbym010.iteye.com/blog/2100868 ide

关于异步能够参考下面这种图:异步编程

QQ截图20160904194537.png

 

这个特性是在0.6版本之后才被加入进行的, 是为了解决NodeJS服务器资源利用率不高的问题,其解决方案就是有一个Maste进程,在启动的时候,再fork()多个work进程,Master监听主端口(好比80),在接受到一个请求后,就会有一个连接句柄,把这个连接句柄发送到Work进程去。 

这里面牵扯到进程间的通讯,这个通讯针对不一样的操做系统进行了封装,以下:

 

虽然NodeJs如今被运的地方不少,可是也仍是有一些问题

  1. 逻辑编写麻烦:NodeJS的程序是基于异步回调的, 因此在编写代码的时候, 会有大量的回调代码,这一点对于那些习惯编写“顺序”代码的程序员有不小的影响。这个相比.Net程序仍是有差距(.Net程序能够以同步的方式写异步代码),目前我查了资料,已经存在一些将异步转为同步的解决方法,还有一种解决方法就是修改语法,以同步的方式编写代码,而后修改编译器或者运行时,将同步转为异步模式运行。 

  2. 单线程:NodeJS的运行时只有一条线程,基于事件循环来处理,这形成了两个问题:

    1. 如今的服务器都是多核心的,而 NodeJS只运行在单核上,不可避免的对服务器的资源形成必定的浪费。

    2. 对IO密集型友好,对CPU密集型不友好,虽然NodeJS底层是基于V8的,性能很高,可是由于是单线程,稍微复杂的逻辑判断就有可能阻塞事件循环。

目前NodeJS自身已经提出了解决方案,就是Cluster,本质就是父子进程的概念,由一个Master进程启动多个Work进程,进程数和CPU核心相关,全部的请求通过Master进程,而后再分配到具体的Work线程,这个模型和Nginx的模型相似, Cluster模型能够解决资源被浪费的状况, 也能从必定程度上缓解CPU的问题,可是和传统的Apache比起来,还有必定差距。

本篇博客部分图片来自 《深刻浅出Node.js》

相关文章
相关标签/搜索