脚本宝典收集整理的这篇文章主要介绍了Why Node.js ?,脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
Node.js是一个基于Chrome V8引擎的js运行环境
node.js特性
单线程
在服务器端语言比如Java,PHP中,每一次客户的连接都会伴随着服务器创建一个新的线程,每个线程大约占据4MB的内存,如果一个服务器内存是16GB,大约允许8000个用户同时连接,如果给更多用户提供服务,就只能增加硬件成本。
而Node.js只是用一个线程,每当有用户连接出发一个内部事件,通过非阻塞IO,事件驱动机制,在宏观上是并行的,同样16GB内存的服务器,Node.js允许用户连接的数量大约是8w个,并且操作系统没有创建、销毁线程的时间开销。
非阻塞I/O
首先两个代码块来解释阻塞IO,和非阻塞IO的区别
阻塞:
var getUserSync = require('./getUserSync');
var user1 = getUserSync('123');
console.log('user1', user1);
var user2 = getUserSync('321');
cnosole.log('user2', uer2);
var sum = 1 + 2;
console.log('The sum is' + sum);
在用id向数据库获取用户的时候,就是一次IO操作,这会花费一定的时间,而获取user2的IO操作必须等到user1获取完成,也就是说,获取user1的时候,IO被阻塞了。时间图如下:
非阻塞:
var getUser = require('./getUser');
getUser('123', function (user1){
console.log('user1', user1);
});
getUser('321', function (user2){
console.log('user2', user2);
});
var sum = 1 + 2;
console.log('The sum is ' + sum);
由于node.js本身的事件处理机制,获取user1,user2的过程是同时进行的,并且不会影响sum变量的初始化,因此可以节省处理时间,这就是非阻塞IO的优势所在。时间图如下:
事件驱动
事件驱动主要用于完成服务器的任务调度
基于事件驱动是有很多好处的,这里举例说明事件驱动解决的问题之一
事件驱动解决雪崩问题
所谓雪崩问题指的是在数据库缓存缺失的情况下大量请求并发涌入数据库查询,通常来说可以通过加状态锁解决,但是单纯的添加状态所会导致只有一次数据服务发生,下面代码对问题进行了解决:
var proxy = new EventProxy();
var status = "ready";
var select = function (callback) {
proxy.once("selected", callback);
if (status === "ready") {
status = "pending";
db.select("SQL", function (results) {
proxy.emit("selected", results);
status = "ready";
});
}
};
node.js的三大特性就是我们选择node.js的原因也是Ryan Dahl当初创造node.js的初衷,当应用程序需要处理大量并发的IO,而在客户端发出响应之前,应用程序内部并不需要进行非常复杂的计算处理(因为单线程意味着某一个用户请求处理的失败可能会导致所有请求的崩溃)的时候,Node.js非常适合,同时也非常适合处理长时间连接实时交互应用程序(因为存在大量IO)。
学习Node.js
学习node.js主要是不断的深入理解使用下面几个内容(下面的一些module也仅仅是我近两天学习接触到的,node成为趋势原因之一就是因为良好的社区生态,所以大家一定要利用好:https://www.npmjs.com/),最好找一些简单的实战项目上手
- 事件循环机制
- node内部模块以及npm第三方模块的使用(主要是http,url,fs,lodash,yargs)
- 网络框架(express,路由的设置)
- 测试(nodemon,mocha)
欢迎正在学习或者想要学习nodejs的同学随时和我交流讨论。
以上是脚本宝典为你收集整理的Why Node.js ?全部内容,希望文章能够帮你解决Why Node.js ?所遇到的问题。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。