若是使用nodejs来搭建Service服务,那么咱们首选express
或者koa
,而fastify
告诉咱们一个数据:javascript
Framework | Version | Router? | Requests/sec |
---|---|---|---|
hapi | 18.1.0 | ✓ | 29,998 |
Express | 4.16.4 | ✓ | 38,510 |
Restify | 8.0.0 | ✓ | 39,331 |
Koa | 2.7.0 | ✗ | 50,933 |
Fastify | 2.0.0 | ✓ | 76,835 |
- | |||
http.Server |
10.15.2 | ✗ | 71,768 |
从数据中能够看出,Koa
的性能远大于express
。固然,它的测试基于简单的单路由测试。不过由此咱们能够看到fastify
的性能远大于Koa
。相信使用过fastify
的小伙伴都会对它的性能速度感到惊讶。其实原理很简单,就是请求的URL快速匹配Callback。如何作到,理论上也很简单,就是找寻它的最短路径来匹配。因此通常可以快速匹配的,都是经过空间换时间的方式来达到效果。java
这里,我还想告诉你们一点,fastify
并非最快的。node
今天的主角就是koa-rapid-router。为何咱们会以KOA
打头呢?由于这篇文章目的实际上是与koa-router
的比较,而不是fastify
。而此路由架构,也是为了在使用KOA
的时候可以接近fastify
的性能(通过测试,没有超过fastify
,KOA
自己的性能也有问题)。git
接下来,咱们会抛出一系列的测试数据来告诉你们Koa-router
的性能是何其糟糕。咱们分别使用这样的原则来测试github
autocannon -c 100 -d 40 -p 10 <url>
测试代码所有在这里express
咱们写入以下的代码npm
for (let i = 0; i < 10000; i++) {
router.get('/uuid/' + (i + 1), async (ctx) => ctx.body = 'ok');
vrouter.get('/uuid/' + (i + 1), (res) => res.end('ok'));
route_2.get('/interface/api/uuid/' + (i + 1), async (ctx) => ctx.body = 'ok');
fastify.get('/interface/api/uuid/' + (i + 1), (request, reply) => reply.send('ok'));
}
复制代码
接着进行测试 npm run test
,获得数据:api
Preview:架构
Results并发
command | architecture | Latency | Req/Sec | Bytes/Sec |
---|---|---|---|---|
test:koa | koa + koa-router |
245.07 ms | 394.25 | 56 kB |
test:fast | fastify |
1.96 ms | 49324 | 7 MB |
test:rapid | koa + koa-rapid-router |
2.17 ms | 44828.8 | 6.37 MB |
test:http | http + koa-rapid-router |
1.64 ms | 58911.2 | 5.95 MB |
从数据上得出结论,koa-router
在有10000个路由的时候,它的性能超级低下,只能达到平均的394.25
,意思就是每秒只能处理394.25个请求,多来就不行。而koa + koa-rapid-router
则处理到了44828.8个。一样是使用KOA
模型,差距很明显。我作了分析,主要是koa-router
内部循环比较多致使的。在10000个请求循环过程当中,效率很是低下。而咱们如何作到达到44828.8的性能,主要咱们在内存中维护了一份静态路由列表,能让程序以最快的速度找到咱们须要的callback。
对比fastify
,能够看出,KOA
自己性能的问题很大。
你们必定会问,对比静态路由Koa-router
确定没有优点,那么咱们来对比动态路由。
咱们写入以下代码
router.get('/zzz/{a:number}', async (ctx) => ctx.body = 'ok');
vrouter.get('/zzz/{a:number}', (res) => res.end('ok'));
route_2.get('/interface/api/zzz/:a(\\d+)', async (ctx) => ctx.body = 'ok');
fastify.get('/interface/api/zzz/:a', (request, reply) => reply.send('ok'));
复制代码
咱们将这段代码加入到10000个静态路由代码的后面,修正测试的路径,咱们获得以下数据:
Results
command | architecture | Latency | Req/Sec | Bytes/Sec |
---|---|---|---|---|
test:koa | koa + koa-router |
220.29 ms | 441.75 | 62.7 kB |
test:fast | fastify |
1.9 ms | 50988.65 | 7.24 MB |
test:rapid | koa + koa-rapid-router |
2.32 ms | 41961.6 | 5.96 MB |
test:http | http + koa-rapid-router |
1.82 ms | 53160.8 | 5.37 MB |
动态路由的对比从必定程度上能够看出koa-router
的糟糕之处,不管是静态路由仍是动态路由,它都基本稳定在400左右的qps。而koa + koa-rapid-router
稍有降低,fastify
一如既往的稳定。可是从http + koa-rapid-router
模型上看,rapid彻底超越fastify
。koa + koa-rapid-router
与koa + koa-router
对比,性能大概是100倍的样子。若是咱们能够这样认定,若是咱们须要高并发,可是仍是使用koa
的生态的话,koa + koa-rapid-router
是最佳选择。若是咱们彻底追求性能,不考虑生态的话,那么fastify
首选。
有人会问,那么为何http + koa-rapid-router
不使用,它但是比fastify
更快的路由?那是由于,http + koa-rapid-router
须要单独创建生态,暂时没法作到大规模使用,也许到最后,咱们能够用上新的基于koa-rapid-router
的企业级服务架构。这也是我正在思考的。
咱们所造的轮子的性能是不可能超越http
模块的性能,咱们只能无限接近它。这就像光速的道理同样,只能接近,没法等于。高性能架构主要仍是在于理念模型,跟数学息息相关。
项目开源在 github.com/cevio/koa-r… 有兴趣的小伙伴关注下,谢谢。