比较如果用nodejs搭建Service服务,那我们更喜欢express还是koa,fastify告诉我们一个数据:FrameworkVersionRouter?Requests/sechapi18。1.0?29,998Express4.16.4?38,510Restify8.0.0?39,331Koa2.7.0?50,933Fastify2.0.0?76,835-http.Server10.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-c100-d40-p10比较静态路由和动态路由的性能差距。测试代码都在这里,用于静态路由对比。我们编写以下代码(leti=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'));}然后测试npmruntest获取数据:Preview:结果commandarchitectureLatencyReq/SecBytes/Sectest:koakoa+koa-router245.07ms394.2556kBtest:fastfastify1.96ms493247MB??test:rapidkoa+koa-rapid-router2.17ms44828.86.37MB4outerrap:httpms58911.25.95MB的数据得出的结论是当koa-router有10000条路由时,性能极低,平均只能达到394.25,也就是说每秒只能处理394.25个请求,再多就不行了。并且koa+koa-rapid-router处理了44828.8。同样使用KOA模型,差距很明显。我做了一个分析,主要是koa-router内部循环比较多。在10000个请求循环中,它的效率非常低。至于如何实现44828.8的性能,我们主要是在内存中维护一个静态的路由表,让程序尽快找到我们需要的回调。对比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个静态路由代码后面,修正测试路径,得到如下数据:ResultscommandarchitectureLatencyReq/SecBytes/Sectest:koakoa+koa-router220.29ms441.7562.7kBtest:fastfastify1.9ms50988.657.24MBtest:rapidkoa+koa-rapid-router2.32ms419MBtest:httphttp+koa-rapid-router1.82ms53160.85.37MB动态路由的对比一定程度上说明了koa-router的劣势。不管是静态路由还是动态路由,基本稳定在400qps左右。虽然koa+koa-rapid-router略有下降,但fastify一如既往地保持稳定。但是从http+koa-rapid-router的模型来看,rapid完全超越fastify。与koa+koa-router相比,koa+koa-rapid-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,有兴趣的小伙伴关注下,谢谢。