Skip to content

Node.js 生态系统中的模式

Node.js、Redux 和 XState 展示了大规模事件驱动与状态管理模式。

模式项目位置作用
观察者Node.jslib/events.jsEventEmitter — Node 事件驱动架构的基础
观察者ReduxcreateStore.tssubscribe() + dispatch() — 状态变化通知
状态机XStateStateMachine.ts工业级有限状态机库
背压Node.jswritable.jswriteOrBuffer()highWaterMark + drain 事件流控
迭代器Node.jslib/internal/streams/流的异步迭代器 — for await (const chunk of stream)
指数退避重试Node.jsdns, httpDNS 解析的指数退避重试
依赖图pnpmgraph-sequencer工作区包的拓扑排序确定构建顺序
限流器Expressexpress-rate-limitAPI 限流的令牌桶中间件
熔断器opossumlib/circuit.jsNode.js 微服务弹性熔断器
事件循环Node.js (libuv)deps/uv/src/unix/core.cuv_run() — 通过 epoll/kqueue 实现单线程 I/O 多路复用
中间件链Koa.jskoa-compose通过 async/await 将中间件组合为洋葱模型管道

模式如何组合:一次 HTTP 请求

当 Express/Koa 服务器处理请求时,模式从网络层到响应层逐级组合:

收到 HTTP 请求
1
事件循环

libuv 的 uv_run() 从 epoll/kqueue 获取 socket 事件。请求被分发到主线程的 JS 回调。无线程阻塞。

2
限流器

express-rate-limit 检查令牌桶。若客户端超出配额,立即返回 429。

3
中间件链

Koa-compose 按洋葱模型运行中间件:auth → validate → handler → log。每层调用 next() 继续或遇错短路。

4
观察者

处理器发出事件(如 'userCreated')。EventEmitter 通知所有订阅者:缓存失效、审计日志、通知服务 — 全部解耦。

5
背压

若响应流式传输大文件,Writable 流应用 highWaterMark。当客户端读取慢时,'drain' 事件暂停生产者以防内存爆炸。

Event Loop 是基石:所有逻辑运行在单线程上,I/O 从不阻塞。这就是 Node.js 能处理数千并发连接的原因——每个请求使用模式(中间件、观察者、背压)而非创建线程。

延伸阅读

基于 MIT 许可证发布。