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 服务端请求性能优化的主要内容,如果未能解决你的问题,请参考以下文章