性能优化之node中间件耗时
背景
中间件在node框架中是很基本的套件,使用不当很容易对页面性能造成影响。除了node服务端外,前端做的SSR项目也要特别重视这块
哪些场景会造成中间件耗时特别严重?

罪魁祸首是:await阻塞
举个例子:
-
如何得到 响应的耗时?
把下面这个中间件放在所有中间件的最前面
app.use(async (ctx, next) => { const t = +new Date(); await next(); console.log('响应的耗时', +new Date() - t); });
-
当没有await阻塞时,服务端处理的速度一般都是非常快的
- 当存在一个中间件加了await阻塞后,例如:
app.use(async (ctx, next) => { await new Promise(r => { setTimeout(() => { r(); }, 2000); }); await next(); });
所有的响应,都会被阻塞!! |
---|
除了await外,还有一个场景要特别注意
除了await外,还有一个场景要特别注意: 跨机房调用
其实,在中间件层,响应请求之前,有几个await是很正常的,因为要为响应做数据的准备。多数情况下请求下游速度都会非常快,除了一种情况,就是跨机房调用,跨机房调用往往会很慢(同机房的话 用服务发现会更快,即使不用服务发现也不慢)
我这边有一组真实数据,可以供大家参考
会await阻塞的中间件有 | A机房耗时p99 | B机房耗时p99 | C机房耗时p99 |
---|---|---|---|
下游1 | 16.4ms | 28.5ms | 9.3ms |
下游2 | 20.6ms | 498.3ms、慢的原因是跨机房调用 | 12.9ms |
下游3 | 6ms | 44ms | 5ms |
- p99指的是99分位的数据,在服务p50和p99相差不大(因为服务器网络条件稳定),不像前端的性能数据,相差比较大(因为各用户网络条件不同)
总结
对node中间件层耗时影响大的主要是2点:
- await阻塞
- 跨机房调用
另外,需要做多机房部署的朋友要注意这块性能问题
码字不易,点赞鼓励!!
转载自:https://juejin.cn/post/7176063831385309221