对照
假如运用nodejs来搭建Service效劳,那末我们首选express
或许koa
,而fastify
通知我们一个数据:
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。怎样做到,理论上也很简朴,就是找寻它的最短途径来婚配。所以平常可以疾速婚配的,都是经由过程空间换时刻的体式格局来到达结果。
这里,我还想通知人人一点,fastify
并非最快的。
主角
本日的主角就是koa-rapid-router。为何我们会以KOA
打头呢?由于这篇文章目标实际上是与koa-router
的比较,而不是fastify
。而此路由架构,也是为了在运用KOA
的时刻可以靠近fastify
的机能(经由测试,没有凌驾fastify
,KOA
自身的机能也有题目)。
接下来,我们会抛出一系列的测试数据来通知人人Koa-router
的机能是何其蹩脚。我们离别运用如许的准绳来测试
- 向每一个架构注入10000个静态路由,测试最末端的谁人。
- 运用雷同的测试敕令
autocannon -c 100 -d 40 -p 10 <url>
- 对照静态路由和动态路由机能上的差异
测试代码悉数在这里
静态路由对照
我们写入以下的代码
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:
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
模块的机能,我们只能无穷靠近它。这就像光速的原理一样,只能靠近,没法即是。高机能架构重要照样在于理念模子,跟数学息息相关。
项目开源在 https://github.com/cevio/koa-rapid-router 有兴致的小伙伴关注下,感谢。