背景
中间件在node框架中是很基本的套件,使用不当很容易对页面性能造成影响。除了node服务端外,前端做的SSR项目也要特别重视这块
哪些场景会造成中间件耗时特别严重?
罪魁祸首是:await阻塞
举个例子:
1.如何得到 响应的耗时?把下面这个中间件放在所有中间件的最前面app.use(async (ctx, next) => {const t = +new Date();await next();console.log('响应的耗时', +new Date() - t);});
2.当没有await阻塞时,服务端处理的速度一般都是非常快的
3.当存在一个中间件加了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点:
1.await阻塞
2.跨机房调用
另外,需要做多机房部署的朋友要注意这块性能问题
最后
整理了75个JS高频面试题,并给出了答案和解析,基本上可以保证你能应付面试官关于JS的提问。
有需要的小伙伴,可以点击下方卡片领取,无偿分享