Головна / Статті

Node проти Bun проти Deno: змагання за багатоканальну роботу кращі за таблиці з одним показником RPS

Багатоканальне змагання Node.js проти Bun проти Deno: чиста продуктивність справді має значення, але знайомість з операціями, дозволи, пам’ять та маршрути, залежні від БД, визначають архітектуру.

Видавець: REACTAPP.TOP7 хв читання1713 слів

Джерела: I Rebuilt the Same API on Node.js, Bun, and Deno. The Surprising Difference Wasn’t Throughput

Критичний показник має більше ніж один шлях

Графіки RPS для чистого HTTP створювали враження, ніби змагання вже закінчилося: Bun значно попереду, Deno на другому місці, Node — позаду. Для прийняття архітектурних рішень потрібно більше, ніж один синтетичний шлях.

export async function handle(request: Request): Promise<Response> {
  const url = new URL(request.url);

  if (url.pathname === "/health") {
    return Response.json({ status: "ok" });
  }

  if (url.pathname.startsWith("/v1/accounts/")) {
    const account = await accounts.find(url.pathname.split("/").pop()!);

    if (!account) {
      return Response.json({ error: "not_found" }, { status: 404 });
    }

    return Response.json(account);
  }

  return Response.json({ error: "not_found" }, { status: 404 });
}
// Bun
Bun.serve({ fetch: handle, port: 3000 });

// Deno
Deno.serve({ port: 3000 }, handle);
deno serve \
  --allow-net=0.0.0.0:3000,postgres.internal,redis.internal \
  --allow-env=DATABASE_URL,REDIS_URL,OTEL_EXPORTER_OTLP_ENDPOINT \
  --allow-read=./config \
  main.ts

Чиста пропускна здатність була реальною, але вона вже не впливала на вибір архітектури

Пропускна здатність має значення на критичних точках кривих витрат. Більшість бізнес-API обмежуються базами даних, механізмами автентифікації та операціями вводу-виводу задовго до досягнення лімітів RPS під час роботи.

Node був найменш цікавим варіантом для роботи, що було компліментом

Гравітація екосистеми Node, знайомість із операціями та передбачуваність процесу розгортання все ще роблять його перевагою серед стандартних платформ. Нудність — це перевага, коли час на підтримку обмежений.

Bun був найшвидшим, коли йому дозволяли бути Bun

Bun вирізняється власними API та інструментами. Примусове дотримання сумісності з Node підриває його переваги; потрібно чесно оцінювати припущення, засновані на властивостях Bun.

Deno зробив права доступу та телеметрію частиною проектування додатків

Модель прав доступу та стандартна бібліотека Deno включають питання безпеки та можливостей моніторингу до самого процесу виконання — а не лише як додаткові елементи мідлверу.

У сфері пам’яті переможці стають невизначеними

Процеси виділення пам’яті, очищення та використання оперативної пам’яті при реалістичних навантаженнях мають більше значення, ніж пік кількості запитів на секунду. Ті, хто програє у використанні пам’яті, стають програшниками з точки зору витрат у контейнерах.

Простота експлуатації залежить від того, що у вас вже є

Якщо організація вже використовує Node на Kubernetes із розвиненими панелями керування, зміна runtime обтяжує всіх. У випадку нових проектів із акцентом на edge-технології Bun/Deno заслуговують на порівняльні тести з використанням багатоканальних метрик: JSON API, multipart-даних, WebSocket та обробників, пов’язаних із БД.

Заключення

Перебудуйте ту саму API для різних середовищ виконання, щоб зрозуміти компроміси — а не обирати „вічного переможця“ на основі одного тесту на навантаження через HTTP. Виберіть середовище, яке підходить для операцій, прав доступу та реальних проблем, з якими ви стикаєтесь.

Опублікуйте інструмент для тестування разом із висновками статті. Скріншоти RPS, які неможливо відтворити, не повинні впливати на стратегію платформи.

До таблиці оцінки функцій/edge включіть показники початкового запуску та роботи через CLI, а не лише стабільний RPS.

Відстежуйте обмеження щодо сумісності: нативні додатки, імпорти node: та бібліотеки для тестування, які передбачають наявність глобальних змінних Node.

Для кожного середовища виконання задокументуйте модель процесу виробництва (кластер, supervisor, ізоляція), яку ви насправді будете використовувати.

Оцініть витрати на тестування у одиницях інженерних днів; приріст RPS у 4 рази, який вимагає переписування механізмів автентифікації та CI, не є безкоштовною покращенням продуктивності.

Якщо ви справді використовуєте кілька середовищ, тримайте «канарейку сумісності», яка щовечора виконує двадцять найпопулярніших маршрутів у кожному середовищі.

Опублікуйте інструмент для тестування разом із висновками статті. Скріншоти показників RPS, які неможливо відтворити, не повинні впливати на стратегію платформи.

До таблиці оцінок функцій/edge включайте показники холодного запуску та роботи через CLI DX, а не лише показник RPS у стабільному режимі.

Стежте за проблемами сумісності: нативними додатками, елементами node: imports та бібліотеками для тестування, які передбачають наявність глобальних змінних Node.

Для кожного середовища задокументуйте модель процесу виробництва (кластер, supervisor, ізоляція), яку ви насправді будете використовувати.

Оцініть витрати на тестування у одиницях інженерних днів; підвищення показника RPS у 4 рази, яке вимагає переписування модулів автентифікації та процесів CI, не є безкоштовним покращенням продуктивності.

Якщо ви справді використовуєте кілька середовищ, тримайте «канарейку сумісності», яка щовечора виконує двадцять найпопулярніших маршрутів у кожному середовищі.

Опублікуйте інструментарій для тестування разом із висновками статті. Скріншоти показників RPS, які неможливо відтворити, не повинні впливати на стратегію платформи.

До таблиці оцінок функцій/країв слід включити показники початкової роботи та роботи через CLI DX, а не лише показники RPS у стабільному режимі.

Відстежуйте проблеми з сумісністю: нативні додатки, імпорти node: та бібліотеки для тестування, які передбачають наявність глобальних змінних Node.

Для кожного середовища виконання задокументуйте модель процесу розгортання в продакшені (кластер, supervisor, ізоляція), яку ви насправді будете використовувати.

Оцініть витрати на тестування у одиницях інженерних днів; підвищення показника RPS у 4 рази, яке вимагає переписування модулів автентифікації та процесів CI, не є безкоштовним покращенням продуктивності.

Якщо ви справді використовуєте кілька середовищ, тримайте „канарейку сумісності“, яка щовечора виконує двадцять найпопулярніших маршрутів у кожному середовищі.

Опублікуйте інструментарій для тестування разом із висновками статті. Скріншоти показників RPS, які неможливо відтворити, не повинні впливати на стратегію платформи.

Включіть показники холодного запуску та продуктивності CLI DX до таблиці оцінки для функцій/edge, а не лише показник RPS у стабільному режимі.

Відстежуйте фактори сумісності: нативні додатки, імпорти у Node та бібліотеки для тестування, які використовують глобальні змінні Node.

Для кожного середовища виконання задокументуйте модель процесу роботи у продакшені (кластер, supervisor, ізоляція), яку ви насправді будете використовувати.

Оцініть витрати на розробку у одиницях інженерних днів; підвищення RPS у 4 рази, яке вимагає переписування модулів автентифікації та CI, не є безкоштовним покращенням продуктивності.

Якщо ви справді використовуєте кілька середовищ, тримайте „канарейку сумісності“, яка щовечора виконує двадцять найпопулярніших маршрутів у кожному середовищі.

Опублікуйте інструменти для тестування разом із висновками статті. Скріншоти показників RPS, які неможливо відтворити, не повинні впливати на стратегію платформи.

Включіть показники холодного запуску та продуктивності CLI DX до таблиці оцінки для функцій/edge, а не лише показник RPS у стабільному режимі.

Відстежуйте проблеми з сумісністю: вбудовані додатки, оператори `node: imports` та бібліотеки для тестування, які сподіваються на глобальні змінні Node.

Для кожного середовища виконання задокументуйте модель процесу виробництва (кластери, supervisor, ізоляція), яку ви насправді будете використовувати.

Оцініть час реалізації у інженерних днях; підвищення RPS у 4 рази за рахунок переписування модулів автентифікації та систем CI не є безкоштовним покращенням продуктивності.

Якщо ви справді працюєте у кількох середовищах, тримайте „канарейку сумісності“, яка щовечора виконує двадцять найпопулярніших маршрутів у кожному середовищі.

Опублікуйте інструменти для тестування продуктивності разом із висновками статті. Скріншоти RPS, які неможливо відтворити, не повинні впливати на стратегію платформи.

У таблицю оцінок для функцій/edge включайте показники холодного запуску та роботи CLI, а не лише RPS у стабільному стані.

Відстежуйте проблеми з сумісністю: вбудовані додатки, оператори `node: imports` та бібліотеки для тестування, які сподіваються на глобальні змінні Node.

Для кожного середовища виконання необхідно задокументувати модель процесу виробництва (кластер, супервайзер, ізоляція), яку ви насправді будете використовувати.

Оцініть час виконання завдань у інженерних днях; підвищення RPS у 4 рази, яке вимагає переписування механізмів автентифікації та процесів CI, не є безкоштовним покращенням продуктивності.

Якщо ви справді використовуєте кілька середовищ, щодня увечері запускайте тестовий екземпляр для перевірки сумісності, який виконує двадцять найпопулярніших маршрутів у кожному середовищі.

Опублікуйте інструменти для тестування разом із висновками статті. Скріншоти RPS, які неможливо відтворити, не повинні впливати на стратегію розробки платформи.

У таблицю оцінок слід включати показники холодного запуску та роботи через CLI для функцій/edge, а не лише показник RPS у стабільному режимі.

Відстежуйте проблеми з сумісністю: нативні додатки, модулі node: imports та бібліотеки для тестування, які передбачають наявність глобальних змінних Node.

Для кожного середовища виконання необхідно задокументувати модель процесу виробництва (кластер, супервайзер, ізоляція), яку ви насправді будете використовувати.

Оцініть витрати конкурсу у одиницях робочого часу інженерів; перемога з показником RPS у 4 рази, яка вимагає переписування модулів автентифікації та CI, — це не безкоштовна продуктивність.

Якщо ви справді використовуєте кілька середовищ, щодня увечері запускайте канаркову версію для перевірки сумісності, яка виконує двадцять найпопулярніших маршрутів.

Опублікуйте інструменти для тестування разом із висновками статті. Скріншоти з неповторними показниками RPS не повинні впливати на стратегію платформи.

У таблицю оцінок для функцій/edge включайте показники холодного запуску та роботи через CLI, а не лише показник RPS у стабільному режимі.

Відстежуйте проблеми з сумісністю: нативні додатки, імпорти у Node та бібліотеки для тестування, які передбачають наявність глобальних змінних Node.

Для кожного середовища задокументуйте модель процесу роботи в продакшені (кластер, supervisor, ізоляція), яку ви насправді будете використовувати.

Оцініть витрати конкурсу у одиницях робочого часу інженерів; перемога з показником RPS у 4 рази, яка вимагає переписування модулів автентифікації та CI, — це не безкоштовна продуктивність.

Якщо ви справді використовуєте кілька середовищ, тримайте „канарейку сумісності“, яка щовечора виконує двадцять найпопулярніших маршрутів у кожному середовищі.

Опублікуйте інструмент для тестування разом із висновками статті. Скріншоти показників RPS, які неможливо відтворити, не повинні впливати на стратегію платформи.

До таблиці оцінок функцій/edge включайте показники холодного запуску та роботи через CLI, а не лише показник RPS у стабільному режимі.

У тестах багатьох маршрутів слід враховувати автентифіковані запити JSON POST, межі завантаження файлів та сценарії роботи ORM — саме там середовища починають відрізнятися після простих запитів типу GET.

Важливі графики навичок команди: перемога з використанням Bun, яка залишає половину співробітників без знань роботи з незнайомим інструментарієм для тестування, є відкладеною перебоєм у роботі.

Стежте за стеками TLS та HTTP/2; мікротести на звичайному HTTP не враховують витрати на завершення операцій у мережевій структурі.

Розмір образу контейнера та результати сканування на наявність CVE відрізняються залежно від базових образів середовищ — інженери будуть враховувати це разом із показниками RPS.

Тести контрактів за стандартом OpenAPI забезпечують чесність порівнянь, коли обробники переміщуються між портами.

Фіксуйте значення затримки p99 у умовах конкуренції, а не лише середнє значення RPS; планувальники можуть приховувати різну поведінку системи у крайніх ситуаціях.

Якщо ви використовуєте систему дозволів Deno, перетворюйте кожен наданий дозвіл на запис архітектурного рішення, щоб майбутні сервіси не таємно розширювали можливості сандбоксу.

Шар сумісності Bun з npm потребує чіткого списку дозволених/заборонених пакетів, які не будуть використовуватися у продакшені.

Node залишається базовим стандартом сумісності: вимірюйте інші системи як відхилення від Node на ваших реальних маршрутах.

Переглядайте це рішення щокварталу; показники продуктивності змінюються, як і ваші «вузькі місця».

Бенчмарки для багатьох маршрутів повинні включати автентифіковані запити JSON POST, обмеження щодо завантаження файлів та сценарії роботи ORM — саме там продуктивність систем відрізняється після простих запитів типу GET.

Графіки навичок команди мають велике значення: успішна робота Bun, яка залишає половину персоналу без засобів для тестування, є відкладеною перервою у роботі.

Слідкуйте за стеками TLS та HTTP/2; мікротестування звичайного HTTP не враховує витрати на завершення операцій у мережевій структурі.

Розмір образу контейнера та результати сканування на наявність CVE відрізняються залежно від базових образів під час виконання — інженери будуть брати це до уваги разом із показником RPS.

Тестування за контрактами на основі OpenAPI забезпечують чесність порівнянь, коли обробники зміщуються між портами.

Фіксуйте значення затримки p99 у умовах конкуренції, а не лише середній показник RPS; схематори приховують різну поведінку систем у крайніх ситуаціях.

Якщо ви впроваджуєте механізми дозволів Deno, перетворюйте кожен дозвіл на запис архітектурного рішення, щоб майбутні сервіси не таємно розширювали можливості сандбоксу.

Шар сумісності Bun з npm потребує чіткого списку дозволених/заборонених пакетів, які не будуть використовуватися у продакшені.

Node залишається базою для порівняння сумісності: вимірюйте інші рішення як відхилення від Node на ваших реальних маршрутах.

Переглядайте це рішення щокварталу; показники продуктивності змінюються, але так само змінюються й вузькі місця у вашій системі.

Бенчмарки для багатьох маршрутів повинні включати автентифіковані запити JSON POST, обмеження щодо завантаження файлів та сценарії роботи ORM — саме там продуктивність починає відрізнятися після простих запитів типу GET.

Графики навичок команди мають значення: успіх використання Bun, який призводить до того, що половина співробітників не може працювати з незнайомим інструментарієм тестування, є відкладеною проблемою з доступністю.

Стежте за стеками TLS та HTTP/2; мікробенчмарки на звичайному HTTP не враховують витрати на завершення операцій у мережевій структурі.

Розмір образу контейнера та результати сканування на наявність CVE відрізняються залежно від базових образів, які використовуються; інженери будуть враховувати це разом із показником RPS.

Тести на дотримання контракту за стандартом OpenAPI забезпечують чесність порівнянь, коли обробники даних працюють на різних портах.

Фіксуйте значення затримки p99 у умовах конкуренції, а не лише середнє значення RPS; механізми планування приховують різну поведінку системи у крайніх ситуаціях.

Якщо ви використовуєте систему дозволів Deno, перетворюйте кожен наданий дозвіл на запис архітектурного рішення, щоб майбутні сервіси не таємно розширювали можливості сандбоксу.

Шар сумісності Bun з npm потребує чіткого списку дозволених/заборонених пакетів, які не будуть використовуватися у продакшені.

Node залишається базовим стандартом сумісності: вимірюйте інші рішення як відхилення від Node на ваших реальних маршрутах.