koa-rapid-router逾越koa-router机能的100多倍

对照

假如运用nodejs来搭建Service效劳,那末我们首选express或许koa,而fastify通知我们一个数据:

FrameworkVersionRouter?Requests/sec
hapi18.1.029,998
Express4.16.438,510
Restify8.0.039,331
Koa2.7.050,933
Fastify2.0.076,835
http.Server10.15.271,768

从数据中可以看出,Koa的机能远大于express。固然,它的测试基于简朴的单路由测试。不过由此我们可以看到fastify的机能远大于Koa。置信运用过fastify的小伙伴都会对它的机能速率觉得惊奇。实在原理很简朴,就是要求的URL疾速婚配Callback。怎样做到,理论上也很简朴,就是找寻它的最短途径来婚配。所以平常可以疾速婚配的,都是经由过程空间换时刻的体式格局来到达结果。

这里,我还想通知人人一点,fastify并非最快的。

主角

本日的主角就是koa-rapid-router。为何我们会以KOA打头呢?由于这篇文章目标实际上是与koa-router的比较,而不是fastify。而此路由架构,也是为了在运用KOA的时刻可以靠近fastify的机能(经由测试,没有凌驾fastifyKOA自身的机能也有题目)。

接下来,我们会抛出一系列的测试数据来通知人人Koa-router的机能是何其蹩脚。我们离别运用如许的准绳来测试

  1. 向每一个架构注入10000个静态路由,测试最末端的谁人。
  2. 运用雷同的测试敕令 autocannon -c 100 -d 40 -p 10 <url>
  3. 对照静态路由和动态路由机能上的差异

测试代码悉数在这里

静态路由对照

我们写入以下的代码

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,获得数据:

Preview:

《koa-rapid-router逾越koa-router机能的100多倍》

Results

commandarchitectureLatencyReq/SecBytes/Sec
test:koakoa + koa-router245.07 ms394.2556 kB
test:fastfastify1.96 ms493247 MB
test:rapidkoa + koa-rapid-router2.17 ms44828.86.37 MB
test:httphttp + koa-rapid-router1.64 ms58911.25.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个静态路由代码的背面,修改测试的途径,我们获得以下数据:

《koa-rapid-router逾越koa-router机能的100多倍》

Results

commandarchitectureLatencyReq/SecBytes/Sec
test:koakoa + koa-router220.29 ms441.7562.7 kB
test:fastfastify1.9 ms50988.657.24 MB
test:rapidkoa + koa-rapid-router2.32 ms41961.65.96 MB
test:httphttp + koa-rapid-router1.82 ms53160.85.37 MB

动态路由的对照从肯定程度上可以看出koa-router的蹩脚的地方,不论是静态路由照样动态路由,它都基础稳固在400摆布的qps。而koa + koa-rapid-router稍有下落,fastify自始自终的稳固。然则从http + koa-rapid-router模子上看,rapid完整逾越fastifykoa + koa-rapid-routerkoa + koa-router对照,机能大概是100倍的模样。假如我们可以如许认定,假如我们须要高并发,然则照样运用koa的生态的话,koa + koa-rapid-router是最好挑选。假如我们完整寻求机能,不斟酌生态的话,那末fastify首选。

有人会问,那末为何http + koa-rapid-router不运用,它但是比fastify更快的路由?那是由于,http + koa-rapid-router须要零丁竖立生态,临时没法做到大规模运用,或许到最后,我们可以用上新的基于koa-rapid-router的企业级效劳架构。这也是我正在思索的。

末端

我们所造的轮子的机能是不可能逾越http模块的机能,我们只能无穷靠近它。这就像光速的原理一样,只能靠近,没法即是。高机能架构重要照样在于理念模子,跟数学息息相关。

项目开源在 https://github.com/cevio/koa-rapid-router 有兴致的小伙伴关注下,感谢。

    原文作者:evio
    原文地址: https://segmentfault.com/a/1190000018529641
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞