Node.js 生态系统中的模式
Node.js、Redux 和 XState 展示了大规模事件驱动与状态管理模式。
| 模式 | 项目 | 位置 | 作用 |
|---|---|---|---|
| 观察者 | Node.js | lib/events.js | EventEmitter — Node 事件驱动架构的基础 |
| 观察者 | Redux | createStore.ts | subscribe() + dispatch() — 状态变化通知 |
| 状态机 | XState | StateMachine.ts | 工业级有限状态机库 |
| 背压 | Node.js | writable.js | writeOrBuffer() — highWaterMark + drain 事件流控 |
| 迭代器 | Node.js | lib/internal/streams/ | 流的异步迭代器 — for await (const chunk of stream) |
| 指数退避重试 | Node.js | dns, http | DNS 解析的指数退避重试 |
| 依赖图 | pnpm | graph-sequencer | 工作区包的拓扑排序确定构建顺序 |
| 限流器 | Express | express-rate-limit | API 限流的令牌桶中间件 |
| 熔断器 | opossum | lib/circuit.js | Node.js 微服务弹性熔断器 |
| 事件循环 | Node.js (libuv) | deps/uv/src/unix/core.c | uv_run() — 通过 epoll/kqueue 实现单线程 I/O 多路复用 |
| 中间件链 | Koa.js | koa-compose | 通过 async/await 将中间件组合为洋葱模型管道 |
模式如何组合:一次 HTTP 请求
当 Express/Koa 服务器处理请求时,模式从网络层到响应层逐级组合:
收到 HTTP 请求▼5
背压
若响应流式传输大文件,Writable 流应用 highWaterMark。当客户端读取慢时,'drain' 事件暂停生产者以防内存爆炸。
Event Loop 是基石:所有逻辑运行在单线程上,I/O 从不阻塞。这就是 Node.js 能处理数千并发连接的原因——每个请求使用模式(中间件、观察者、背压)而非创建线程。