koa-rapid-router超越koa-router性能的100多倍

對比

若是使用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的性能(通過測試,沒有超過fastifyKOA自己的性能也有問題)。git

接下來,咱們會拋出一系列的測試數據來告訴你們Koa-router的性能是何其糟糕。咱們分別使用這樣的原則來測試github

  1. 向每一個架構注入10000個靜態路由,測試最末尾的那個。
  2. 使用相同的測試命令 autocannon -c 100 -d 40 -p 10 <url>
  3. 對比靜態路由和動態路由性能上的差距

測試代碼所有在這裏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:架構

koa-rapid-router:static

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個靜態路由代碼的後面,修正測試的路徑,咱們獲得以下數據:

koa-rapid-router:dynamic

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徹底超越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模塊的性能,咱們只能無限接近它。這就像光速的道理同樣,只能接近,沒法等於。高性能架構主要仍是在於理念模型,跟數學息息相關。

項目開源在 github.com/cevio/koa-r… 有興趣的小夥伴關注下,謝謝。

相關文章
相關標籤/搜索