likes
comments
collection
share

性能优化之node中间件耗时

作者站长头像
站长
· 阅读数 7

背景

中间件在node框架中是很基本的套件,使用不当很容易对页面性能造成影响。除了node服务端外,前端做的SSR项目也要特别重视这块

哪些场景会造成中间件耗时特别严重?

性能优化之node中间件耗时

罪魁祸首是:await阻塞

举个例子:

  1. 如何得到 响应的耗时?

    把下面这个中间件放在所有中间件的最前面

    app.use(async (ctx, next) => {
      const t = +new Date();
      await next();
      console.log('响应的耗时', +new Date() - t);
    });
    
  2. 当没有await阻塞时,服务端处理的速度一般都是非常快的

性能优化之node中间件耗时

  1. 当存在一个中间件加了await阻塞后,例如:
    app.use(async (ctx, next) => {
      await new Promise(r => {
        setTimeout(() => {
          r();
        }, 2000);
      });
      await next();
    });
    

性能优化之node中间件耗时

所有的响应,都会被阻塞!!

除了await外,还有一个场景要特别注意

除了await外,还有一个场景要特别注意: 跨机房调用

其实,在中间件层,响应请求之前,有几个await是很正常的,因为要为响应做数据的准备。多数情况下请求下游速度都会非常快,除了一种情况,就是跨机房调用,跨机房调用往往会很慢(同机房的话 用服务发现会更快,即使不用服务发现也不慢)

我这边有一组真实数据,可以供大家参考

会await阻塞的中间件有A机房耗时p99B机房耗时p99C机房耗时p99
下游116.4ms28.5ms9.3ms
下游220.6ms498.3ms、慢的原因是跨机房调用12.9ms
下游36ms44ms5ms
  • p99指的是99分位的数据,在服务p50和p99相差不大(因为服务器网络条件稳定),不像前端的性能数据,相差比较大(因为各用户网络条件不同)

总结

对node中间件层耗时影响大的主要是2点:

  1. await阻塞
  2. 跨机房调用

另外,需要做多机房部署的朋友要注意这块性能问题


码字不易,点赞鼓励!!