本文次要探讨以下问题:
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 依照事件队列的程序执行事件队列中的事件。在其中一个工作实现之前,回调和监听器等其余函数都没有机会运行,因为被阻塞的事件循环没有机会解决它们。如果产生这种状况,程序执行速度将会变慢。点此下载残缺附件