Node.js是一个基于ChromeV8引擎的js运行环境。Node.js的特点是单线程。在Java、PHP等服务器端语言中,客户端每连接一次,服务器就创建一个新的。每个线程占用大约4MB的内存。如果服务器有16GB的内存,则允许大约8,000个用户同时连接。如果为更多的用户提供服务,只会增加硬件成本。然而,Node.js只使用一个线程。每当用户连接时,都会触发一个内部事件。通过非阻塞IO和事件驱动机制,在宏观上实现了并行。同样是16GB内存的服务器,Node.js允许用户连接大约是8w,操作系统没有创建和销毁线程的时间开销。Non-blockingI/O先用两个代码块来解释blockingIO和non-blockingIOblocking的区别:vargetUserSync=require('./getUserSync');varuser1=getUserSync('123');console.log('用户1',用户1);varuser2=getUserSync('321');cnosole.log('user2',uer2);变量总和=1+2;console.log('总和为'+sum);在使用id从数据库中获取用户时,是一个IO操作,会耗费一定的时间,而获取user2的IO操作必须等到user1获取完成,即获取user1时,IO被阻塞。时序图如下:非阻塞:vargetUser=require('./getUser');getUser('123',function(user1){console.log('user1',user1);});getUser('321',function(user2){console.log('user2',user2);});varsum=1+2;console.log('总和为'+sum);由于node.js本身的事件处理机制,getuser1和user2的过程是同时进行的,不会影响sum变量的初始化,所以可以节省处理时间,这是优点非阻塞IO。时序图如下:事件驱动事件驱动主要用来完成服务端的任务调度。基于事件驱动有很多好处。下面举个例子来说明事件驱动解决的其中一个问题。事件驱动解决了雪崩问题。所谓雪崩问题是指数据库缓存不足在大量请求并发涌入数据库查询的情况下,通常可以通过加状态锁来解决,但是单纯加状态只会导致一个数据服务发生。下面的代码解决了这个问题:varproxy=newEventProxy();varstatus="ready";varselect=function(callback){proxy.once("selected",callback);如果(状态===“准备就绪”){状态=“待处理”;db.select("SQL",function(results){proxy.emit("selected",results);status="ready";});}};node.js的三大特性是我们选择node.js和RyanDahl最初创建的原因node.js的初衷是当应用程序需要处理大量并发IO时,在客户端发送响应之前,应用不需要进行很复杂的计算(因为单线程意味着一个用户请求处理失败可能会导致所有请求崩溃),Node.js很适合,也很适合处理长期的连接实时交互应用(因为有很多IO)。学习Node.js学习node.js主要是不断的理解和使用下面的内容(下面的一些模块只是我这两天学到的,node之所以成为潮流的原因之一是因为社区不错生态,所以大家一定要好好利用:https://www.npmjs.com/),最好找一些简单实用的项目来入门事件循环机制节点内部模块和npm第三方的使用模块(主要是http、url、fs、lodash、yargs)网络框架(express、路由设置)测试(nodemon、mocha)欢迎正在学习或者想学习nodejs的同学随时和我交流。
