В сравнении
Если вы используете 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
Насколько плох спектакль. Мы отдельно используем такие принципы для тестирования
- Добавьте 10 000 статических маршрутов в каждую схему, протестировав последний.
- Используйте ту же тестовую команду
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'));
Добавляем этот код в конец 10 000 кодов статической маршрутизации, модифицируем тестовый путь и получаем следующие данные:
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/ Смотри-ка…Заинтересованные друзья обратите внимание, спасибо.