Koa.js 服务端请求性能优化

Posted JavaScript与编程艺术

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Koa.js 服务端请求性能优化相关的知识,希望对你有一定的参考价值。

最近在进行 API Restful 改造,其间测试同学老是”质问“为什么保存一个资源而已页面响应这么慢,不是说用了SPA(Single Page Application),页面响应如丝般顺滑吗?哎,知道真相的我眼泪掉下来,只能替 SPA 说一句:“这锅我不背”。那这个黑锅该由谁来背?

应该由服务器端来背。

我们已经很习惯利用 Koa 内置的关键字 yield 来处理异步请求同时避免 ”callback hell“,从而获得和同步执行代码一样的可读性,但是 yield还具备一个鲜为人用的功能:并行加载资源。

在 Koa 世界里,一切异步操作均可被视为 Promise,均可被 yield,HTTP 请求和数据库操作自然不例外。

举个例子,如下代码:

* fetchSequentially() {
 const result = {};

 // 可以是 http 请求或数据库操作
 result.resource1 = yield this.client.getResource1();
 result.resource2 = yield this.client.getResource2();

 return Promise.resolve(result);
}

能看出来上面那段简单的代码有什么问题吗?来测量下代码执行时间吧。

* fetchSequentially() {
 const responses = {};

 console.time('Total costs');

 console.time('Get "resource1" costs');
 responses.resource1 = yield this.client.getResource1();
 console.timeEnd('Get "resource1" costs');

 console.time('Get "resource2" costs');
 responses.resource2 = yield this.client.getResource2();
 console.timeEnd('Get "resource2" costs');

 console.timeEnd('Total costs');

 return responses;
}

执行结果:

Get "resource1" costs: 407ms
Get "resource2" costs: 376ms
Total costs: 783 ms

很明显可以看出时间总和是获取两个资源时间的累加,原因是 yield 之后的代码必须等待被 yield 的资源获取完毕(成功或失败)才会继续执行。

方案

那么如何优化呢?

* fetchParallelly() {
 console.time('Total costs');

 const responses = yield {
   resource1: this.client.getResource1(),
   resource2: this.client.getResource2(),
 };

 console.timeEnd('Total costs');

 return responses;
}

执行结果:

Total costs: 379ms

耗费时间总和等于耗费时间最长的那个。

为什么会出现如此大幅度的效率提升呢?因为 yield 会对包装入对象或数组中的资源,进行并行加载,所以时间之和取二者最长的那个。

重构后的代码是不是既简单易读又兼具性能

以上是关于Koa.js 服务端请求性能优化的主要内容,如果未能解决你的问题,请参考以下文章

前端性能优化总结

高性能系统架构分析

后端服务性能优化实战篇

MySQL性能优化

前端性能优化

nginx优化_性能方面的优化