为了账号安全,请及时绑定邮箱和手机立即绑定

Node.js性能优化八大技巧:多年实战经验总结

8 个我多年编码经验中的 Node.js 性能优化技巧

8 Node.js Performance Tips I Discovered After Years of Coding

Node.js非常适合构建可扩展且高性能的应用程序,但说到底,要充分发挥其潜力,仅仅懂JavaScript是不够的。多年来,我学到的(有时是通过艰难的方式)是让我的Node.js应用程序发挥最佳性能。这里有八条技巧,我希望早些有人告诉我。

1. 使用异步代码,但要小心

Node.js依赖其非阻塞特性而繁荣。默认情况下,它更倾向于异步代码,但有个需要注意的地方。如果你在链接Promise或使用async/await,要注意潜在的瓶颈,比如本可并行却顺序执行的情况。

比如说,

    // 不好:依次请求    
    await fetchData1();    
    await fetchData2();    

    // 好:并发请求    
    await Promise.all([fetchData1(), fetchData2()]); // 并发请求可以提高效率
    // 等待异步操作完成
2. 集群模式是你的最好拍档

默认情况下,Node.js 在单线程上运行。在多核机器上,这样就有点浪费了。可以使用 cluster 模块或类似 PM2 的进程管理器来充分利用所有可用的核心资源。

用PM2。

pm2 start app.js -i max

使用pm2启动名为app.js的应用程序,运行时使用最大可用的实例数。

充分利用CPU核心的数量来启动相应数量的进程,以达到最大的吞吐量。

3. 能缓存的都缓存起来

频繁的数据库查询会影响你应用的性能。可以使用像 Redis 这样的缓存层或内存解决方案来存储那些耗时或频繁访问的数据。

    const cache = new Map();    

    function getUserData(userId) {    
      如果缓存包含(userId) {    
        返回缓存.get(userId);    
      }    

      const data = 从数据库获取(userId);    
      缓存.set(userId, data);    
      返回数据;    
    }

像这样的简单缓存机制可以显著降低延迟。

4. 优化中间件使用方法

中间件堆叠可能会导致不必要的处理。我见过的应用中,每个路由都被五层中间件层层包裹,甚至是对静态资源也是如此!审计你的中间件,并移除任何多余的中间件。使用条件逻辑,只在需要时加载中间件。

    app.use((req, res, next) => {    
      if (req.path.startsWith('/api')) {    
        // 只有API路由才会执行此中间件    
        next();    
      } else {    
        res.send('这不是API路由');    
      }    
    });
5. 防止内存泄漏

Node.js中的内存泄漏常常是由意外的全局变量或未清理的事件监听器引起的。可以使用诸如 clinic.jsnode --inspect 等工具帮助找到这些泄漏的位置。

这里有一个例子哦,

    // 错误做法:重复监听数据。    
    socket.on('data', handleData);    

    // 正确做法:移除监听器。    
    socket.off('data', handleData);

还需要使用 WeakMap 来处理那些需要自动垃圾回收机制的对象。

6. 利用数据流处理大量数据

如果你在处理大型文件或数据集时,不要一次性全部加载到内存。使用 Node.js 流进行高效分块处理。

    const fs = require('fs');    

    fs.createReadStream('largeFile.txt')    
      .pipe(process.stdout)    
      .on('error', console.error);

注释:这段代码用于读取largeFile.txt文件,并将其输出到标准输出,同时处理可能出现的错误。

这样做可以防止你的应用在处理大文件时出现内存不足的问题。

7. 监控事件循环滞后

当事件循环积压时,一切都将变得缓慢。使用 , setImmediateprocess.nextTick 将繁重的同步任务移出。更好的方法是将大型计算拆分成更小的部分。

function heavyTask() {    
  for (let i = 0; i < 1e7; i++) {    
    if (i % 1e6 === 0) {    
      setImmediate(() => console.log(`处理中的块:${i}`));    
    }    
  }    
}
// 执行一个重负载的任务,每隔一百万次迭代输出当前处理的块:
heavyTask();

这可以防止事件循环阻塞,确保应用程序保持响应。

8. 使用正确的工具来监控性能

最后,你无法改善无法衡量的问题。工具比如 New Relic、Datadog 或者使用 node --prof 可以帮助你发现应用变慢的地方。不要仅仅设置好后就不管了——要持续关注你的应用。

    node --prof app.js

启动带有性能分析的Node.js应用程序 (Starts a Node.js application with performance profiling)

这会生成一个性能日志文件,你可以用 v8-profiler 这样的工具来分析它。

最后的感想

这些性能技巧是无数调试会话、失败的部署以及偶尔的顿悟时刻的结晶。虽然每个应用都有其独特性,但这些原则是通用的。从小调整开始,衡量其影响,并不断优化。

你也可能喜欢:

1)怎样才能优化网站的性能?

2)Load Testing with Artillery: 使用Artillery进行负载测试:应对Node.js应用程序的峰值流量

  1. 软件开发面试中常常问的十个问题及如何回答

4)中级JavaScript Promise面试问题,

5)什么是数据库索引,为什么很重要?

6)AI能否改变交易格局?

7)部署流水线(deploy pipeline)有什么用?

8)为现代应用选择JWT还是Paseto的对比

9)Node.js 面向高流量 API 的速率限制及滥用预防策略详解

更多博客点击这里这里

有没有什么拿手表演技巧我没提到?告诉我吧,我总是很乐意从大家那儿学到更多?

嘿,如果你发现这篇帖子有帮助,你肯定会爱上我推荐的这个课程 这个课程。它包含了你所需的所有内容,帮助你更上一层楼!

关注我LinkedIn

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消