理解NodeJS

# 理解NodeJS

近几年Node被炒的火热,总应该了解一下Node是什么?能解决什么问题?

## Node是什么?
Node是运行在服务器上的JavaScript解释器,可以理解为服务器上并且可以解释JavaScript的虚拟机。Node的优势在于异步运行,伸缩性好。此外,JavaScript可以在前后端运行,有利于统一代码格式。

## 为什么用Node?

Node官方称,“可以创建快速地、可伸缩的网络应用”。与Java和PHP等服务端语言不同的是,Node使用的是事件驱动,非阻塞的IO模型能够让Node高效运行,尤其适用于对数据敏感的实时应用,比如微博、微信等。

**事件驱动**

事件驱动编程模型,是根据事件做出响应。为程序运行过程中遇到的事件绑定响应函数,那么每当这个事件被触发时,都可以做出相应的响应。例如浏览器向服务器请求某个页面,服务器获得请求之后,需要先读取这个页面相应的内容,并发送给浏览器。服务器在等待页面读取的过程中,就会浪费几毫秒,虽然几毫秒对于浏览器而言不重要,而对于处理大量请求的服务器就很可观了。在事件驱动模型中,只要定义了获得请求后的处理函数和读取页面完成的响应函数,那么在读取页面内容的过程中,服务器还可以处理其他请求。当页面读取完成后,再将页面内容返回给浏览器。如果对于有大量IO的服务器而言,事件驱动的编程模型就十分重要。

事件驱动的编程模型并不新鲜,但是却能给应用程序带来性能的很大的提升,是因为事件驱动避免了阻塞状态。顺序执行的代码,每次调用其他模块的代码,都要等待其他模块返回结果,这就是阻塞状态。应用程序总会调用其他模块,也总会出现阻塞状态,必然降低程序的执行效率。

在本地应用中,多线程很好的解决了这一问题。如果某个作业执行时间长,那么就给他另行分配一个线程。这样耗时长的作业不会影响到整个应用的执行效率。而在服务器中,为很多应用服务,需要处理很多链接和请求。因此通常会为每个链接分配一个线程,多线程在服务器编程中变得十分常见。

然而在网络应用中,多线程并没有真正解决阻塞的问题。每个线程都分配了相应的内存和CPU时间,每个线程服务于某一个连接。然而对于某一个线程而言,服务的状态也会存在阻塞,比如在等待客户端回应的时间里。

**多线程实现的非阻塞网络连接和事件驱动的非阻塞网络连接**

多线程的网络连接可以避免等待页面读取、数据库查询等处理过程的阻塞,可以提高服务器的响应速度。但是这并不意味着这就是最好的实现方式。

比如在Java实现的服务器上,为每个session分配一个线程,而每个线程需要占据2M的内存。对于一个8G内存的服务器,理论上能够同时服务4000个用户。但是随着客户群的增长,必须要配置更多的服务器,服务器的成本会越来越高。那么这么Web应用的瓶颈就是,服务器能够处理的并发连接的最大数量。

Node是如何解决高并发的问题的呢?Node不会为每一个连接分配一个线程,而是每个连接、每个请求都触发一个事件。Node在进程中不断的处理事件,没有阻塞I/O的调用,也没有线程之间的轮询。因此,Node服务器被认为有能力处理数万个并发连接的程序。

## Node如何工作?
Node是在V8引擎上运行的服务器,V8是用于Chrome的JavaScript引擎,C++实现的超快的JavaScript解释器。只要有强大的解释器支持,服务器端和客户端都一样,同样可以有JavaScript处理各类事件。

而且JavaScript在服务器端有更重要的优势,JavaScript是事件驱动的编程语言。利用匿名函数,JavaScript很容易实现事件驱动的Web服务器。而且JavaScript更容易编写,只需要监听各类事件,编写相应的回调函数,剩下的都由系统处理。

**参考:**

[NodeJS入门](http://www.nodebeginner.org/index-zh-cn.html)

[Node.js 究竟是什么?](http://www.ibm.com/developerworks/cn/opensource/os-nodejs/)

[被误解的 Node.js](http://www.ibm.com/developerworks/cn/web/1201_wangqf_nodejs/)

posted on 2013-11-29 20:45  洪雁君  阅读(415)  评论(0编辑  收藏  举报

导航