# 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为什么支持高并发?多线程除了上下文切换还有什么影响性能?

陕ICP备20004732号-3