对Node.js事件驱动模型的深入理解

原创
09/23 09:33
阅读数 118

本文主要讨论以下问题:

1.Node.js的事件驱动模型分析

2.Node.js如何处理高并发请求?

3.Node.js的缺点介绍

先简单介绍一下Node.js,Node.js是基于事件驱动、非阻塞I/O模型的服务器端JavaScript运行环境,是基于Google的V8引擎在服务器端运行的单线程、高性能的JavaScript语言。

一、Node.js事件驱动模型分析

 

看懂上图之后,你就明白Node.js的事件驱动模型了,从上图中我们可以看到以下几个部分:

Application应用层,也就是JavaScript交互层,是Node.js的常用模块,比如http,fs等。

V8是V8引擎层,主要用于解析JavaScript,与应用层和NodeApi层交互。

NodeApi为上层模块提供系统调用,并与操作系统交互。

Libuv是一个跨平台的底层包,实现了线程池、事件循环、文件操作等。实现异步是Node.js的核心。

Libuv层维护一个事件队列的事件队列。当请求到来时,Node.js的应用层和NodeApi层将请求作为事件放入事件队列,设置回调事件函数,然后继续接受新的请求。

在Libuv层的Event Loop事件循环中,事件队列中的事件被连续读取。在读取事件的过程中,如果遇到非阻塞事件,就自己处理,处理完后调用回调函数将结果返回给下一层。对于阻塞事件,会委托给后台线程池来处理。当这些阻塞操作完成后,执行结果将和提供的回调函数一起放入事件队列。当事件循环再次读取该事件时,将再次执行放置在队列中的事件回调函数,最后将结果返回给上级。详情请参考下图:

 

 

二、Node.js如何处理高并发请求?

如果你理解了最后一个问题,就好理解了。如果要总结的话,就是异步无阻塞编程的思想。当遇到耗时的操作时,会以异步非阻塞的方式进入事件队列,不会影响后续请求的执行。循环将读取这个耗时的请求,并将其交给线程池进行处理。当这些耗时的操作被处理后,会再次进入事件队列,请求结果通过事件循环和回调返回给上层应用,最终返回给客户端。以上方式减少了高并发的等待时间,让高并发可以从容应对。

三、Node.js的缺点介绍

通过上面的介绍,我们知道了Node.js的事件驱动模型,下面我们将介绍Node.js的不足之处。

Node.js最大的缺点是一次只能服务一个请求。目前大部分服务器都是多核CPU,导致CPU利用率非常低,资源浪费。

Node.js的主线程Event Loop按照事件队列的顺序执行事件队列中的事件。在其中一个任务完成之前,回调和监听器等其他函数都没有机会运行,因为被阻塞的事件循环没有机会处理它们。如果发生这种情况,程序执行速度将会变慢。点此下载完整附件

展开阅读全文
加载中

作者的其它热门文章

打赏
0
0 收藏
分享
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部