koa-rapid-router превосходит koa-router более чем в 100 раз

Node.js koa

В сравнении

Если вы используете 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 быстро совпадает с Обратным вызовом. Как это сделать в теории тоже очень просто, то есть найти кратчайший путь к совпадению. Поэтому, как правило, можно быстро сопоставить, а эффект достигается за счет изменения пространства во времени.

Здесь я хотел бы сказать вам еще одну вещь,fastifyНе самый быстрый.

главный герой

Сегодняшний главный геройkoa-rapid-router. Зачем намKOAЧто насчет головы? Поскольку цель этой статьи состоит в том, чтобыkoa-routerсравнение вместоfastify. И эта архитектура маршрутизации также предназначена для использованияKOAможно подойти, когдаfastifyпроизводительность (проверено, не болееfastify,KOAСама производительность тоже проблема).

Далее мы бросим серию тестовых данных, чтобы рассказать вамKoa-routerНасколько плох спектакль. Мы отдельно используем такие принципы для тестирования

  1. Добавьте 10 000 статических маршрутов в каждую схему, протестировав последний.
  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: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'));

Добавляем этот код в конец 10 000 кодов статической маршрутизации, модифицируем тестовый путь и получаем следующие данные:

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 запросов в секунду. а также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/CE vi O/ Смотри-ка…Заинтересованные друзья обратите внимание, спасибо.