# Node.js
# Node介绍
Node.js 是 Javascript 在服务端的运行环境,构建在 chrome 的 V8 引擎之上,基于事件驱动、非阻塞 I/O 模型,充分利用操作系统提供的异步 I/O 进行多任务的执行,适合于 I/O 密集型的应用场景,因为异步,程序无需阻塞等待结果返回,而是基于回调通知的机制,原本同步模式等待的时间,则可以用来处理其它任务
# Node 环境中的事件循环(Event Loop)
Node.js中的事件循环分为6个阶段 (TIIPCC)
poll check close timer I/O idle/prepare
┌───────────────────────┐
┌─>│ timers │
│ └──────────┬────────────┘
│ ┌──────────┴────────────┐
│ │ I/O callbacks │
│ └──────────┬────────────┘
│ ┌──────────┴────────────┐
│ │ idle, prepare │
│ └──────────┬────────────┘ ┌───────────────┐
│ ┌──────────┴────────────┐ │ incoming: │
│ │ poll │<── connections ─── │
│ └──────────┬────────────┘ │ data, etc. │
│ ┌──────────┴────────────┐ └───────────────┘
│ │ check │
│ └──────────┬────────────┘
│ ┌──────────┴────────────┐
└──┤ close callbacks │
└───────────────────────┘
timers timers 阶段会执行 setTimeout 和 setInterval
I/O callbacks
I/O阶段会执行除了close 事件,定时器和setImmediate的回调
idle, prepare 队列的移动,仅系统内部使用
poll poll 阶段很重要,这一阶段中,系统会做两件事情
1.执行到点的定时器 2.执行 poll 队列中的事件
并且当 poll 中没有定时器的情况下,会出现以下两件事情:
- 如果 poll 队列不为空,会遍历回调队列并同步执行,直到队列为空或者系统限制
- 如果 poll 队列为空,会有两件事发生
- 如果有 setImmediate 需要执行,poll 阶段会停止并且进入到 check 阶段执行 setImmediate
- 如果没有 setImmediate 需要执行,会等待回调被加入到队列中并立即执行回调
- 如果有别的定时器需要被执行,会回到 timer 阶段执行回调。
check check阶段执行setImmediate
close callbacks close callbacks 阶段执行 close 事件
# Node 多进程
进程
进程 Process 是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位
,是操作系统结构的基础,进程是线程的容器。进程是资源分配的最小单位
。我们启动一个服务、运行一个实例,就是开一个服务进程
线程
线程是操作系统能够进行运算调度的最小单位,首先我们要清楚
线程是隶属于进程`的,被包含于进程之中。一个线程只能隶属于一个进程,但是一个进程是可以拥有多个线程的。
Node.js 是 Javascript 在服务端的运行环境,构建在 chrome 的 V8 引擎之上,基于事件驱动、非阻塞 I/O 模型,充分利用操作系统提供的异步 I/O 进行多任务的执行,适合于 I/O 密集型的应用场景,因为异步,程序无需阻塞等待结果返回,而是基于回调通知的机制,原本同步模式等待的时间,则可以用来处理其它任务。
Node.js 可以使用两种方式来开启多进程
- child_process模块的
fork
开启一个子进程 - cluster模块
# Node 多线程
worker_threads
模块允许使用并行执行 JavaScript 的线程
# Node进程通信
分为同一主机or不同主机
同一主机:
- IPC message (前提是通过fork来的)
- 自定义管道
不同主机:
- TCP套接字
- Http请求
# 对BFF有什么理解?Node为什么支持高并发?多线程除了上下文切换还有什么影响性能?
← Typescript 性能优化 →