Node.js 很慢吗?只有在你不知道这个的时候 🚀
发布: (2025年12月20日 GMT+8 13:34)
4 min read
原文: Dev.to
Source: Dev.to
真相炸弹
Node.js 并不慢。大多数 Node.js 应用慢是因为开发者使用方式不当。
常见误区
- “Node.js 处理不了大规模” ❌
- “Node.js 是单线程的,所以很慢” ❌
- “我们应该改写成 Java/Spring” ❌
Node.js 为 Netflix、PayPal、Uber、LinkedIn、Walmart 等众多公司提供动力。
为什么 API 感觉慢
阻塞事件循环
// 这会阻塞所有操作
const result = fs.readFileSync('big-file.txt');
// 非阻塞版本
fs.readFile('big-file.txt', (err, data) => {
// 处理数据
});
规则: 在生产环境的 API 中绝不要使用同步方法。
Node.js 特性
- JavaScript 执行是单线程的
- 底层是多线程的(libuv 线程池)
- 事件驱动 & 非阻塞
把 Node.js 想象成一条高速快车道:如果中间有卡车停下(阻塞代码),一切都会堵塞。
CPU 密集型任务
Node.js 并不适合:
- 图像处理
- PDF 生成
- 加密循环
- 实时视频处理
- 机器学习训练
卸载工作
- Worker Threads 用于后台任务(BullMQ、RabbitMQ、Kafka)
- 微服务用于重计算
const { Worker } = require('worker_threads');
// 使用 worker 来运行 CPU 密集型代码
数据库瓶颈
90 % 的慢 Node.js 应用实际上是慢数据库导致的:
- 缺少索引
- N+1 查询
- 拉取不必要的列
CREATE INDEX idx_user_email ON users(email);
规则: 先优化数据库——Node.js 很少是瓶颈。
缓存
如果每个请求都直接访问数据库,应用会爬得很慢。使用:
- Redis(内存缓存)
- HTTP 缓存头
redis.get(key) || fetchFromDB();
仅缓存就能提升 10×–100× 的性能。
并行执行
await task1();
await task2(); // 顺序执行
await Promise.all([task1(), task2()]); // 并行执行
并行执行很重要。
流(Streams)
很多开发者忽视流——这是大错误。
// 错误:把整个文件加载到内存
const data = fs.readFileSync('1GB.log');
// 正确:低内存,高性能
fs.createReadStream('1GB.log').pipe(res);
流提供低内存占用和高吞吐量。
横向扩展
Node.js 通过横向扩展,而不是纵向扩展。
- Cluster 模式
- PM2
- Kubernetes
- AWS 自动伸缩组
每个 CPU 核心运行一个 Node 进程。
何时避免使用 Node.js
避免在以下场景使用 Node.js:
- 重 CPU 计算
- 实时视频处理
- 机器学习训练
Node.js 在 I/O 密集、高并发的系统中表现出色。
推荐技术栈
- Node.js + Fastify / NestJS – 能高效处理数百万用户。
结论
Node.js 并不慢。慢的是糟糕的架构。如果你:
- 尊重事件循环
- 优化数据库和缓存
- 正确使用异步模式
Node.js 将超越大多数传统技术栈。