🎞️

Node.js 设计原理与适用场景

Tag
Node
技术
Slug
nodejs-design-partten
Created
Jul 9, 2023
Node.js 是一个基于事件驱动非阻塞 I/O 模型的运行时环境。基于这样的特性,非常适合处理 I/O 密集型场景,比如大量的网络请求(网关),而不适合处理 CPU 密集型场景。
在解释为什么说 Node 适用于 I/O 密集型场景前,首先需要理解同步、异步以及阻塞、非阻塞的区别:
在 I/O 操作中,同步指的是处理一个任务,操作的完成和返回是“一致”的,也就说在任务完成之前,并不会给到调用者一个结果。而异步的操作和返回值是“不一致”的,操作尚未完成会给一个返回值,操作完成后会通过一些策略来反馈给调用者(比如回调、Promise、事件等)。
在 I/O 操作中,阻塞指的是操作尚未完成会将任务挂起,直到数据准备完成才会返回结果。而非阻塞指的是如果数据还没有准备好,操作会立即返回一个结果,表示数据还没有准备好。
想象一下网关的场景,Node 频繁收到来自外部的网络请求,因为非阻塞的特性,Node 在接收到一个请求后,并不会一直等到这个请求完成,而是马上就处理下一个请求。当某个请求完成后,就会通过事件驱动或者回调函数的方式通知结果。
在传统服务器中,处理高并发的请求往往需要启动大量的线程,每个线程都会占用一定的内存和 CPU 资源,当并发数量过大时,就可能会导致服务器奔溃。而 Node 因为自身的特性,使用一个线程就可以处理大量并发请求。