Node против Bun против Deno: сравнение по количеству маршрутов превосходит графики RPS
Соревнование Node.js, Bun и Deno с несколькими маршрутами: чистая пропускная способность действительно важна, но архитектуру определяют знакомство операторов с инструментами, права доступа, использование памяти и маршруты, зависящие от базы данных.
Источники: 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 с развитыми панелями управления, смена фреймворков создаст дополнительные сложности для всех. Если же речь идет о новых проектах с акцентом на работы на периферии, Bun/Deno заслуживают сравнительных тестов с использованием многопутевых сценариев: JSON-API, multipart-данные, WebSocket и обработчики, связанные с базами данных.
Заключение
Пересоздайте ту же API для разных сред выполнения, чтобы понять соотношение преимуществ и недостатков — а не чтобы определить «вечного победителя» на основе одного теста на нагрузку через HTTP. Выбирайте среду выполнения, которая соответствует условиям эксплуатации, правам доступа и реальным узким местам.
Опубликуйте инструменты для тестирования производительности вместе с выводами статьи. Скриншоты показателей RPS, которые невозможно воспроизвести, не должны определять стратегию платформы.
Включайте в оценку не только показатели RPS в устойчивом режиме, но и время запуска функций при первом вызове, а также удобство использования через командную строку.
Отслеживайте ограничения, связанные с совместимостью: нативные дополнения, импорты в Node и библиотеки тестирования, которые предполагают наличие глобальных переменных Node.
Для каждой среды выполнения задокументируйте модель процесса развертывания в продакшене (кластеры, механизмы контроля, изоляция процессов), которую вы действительно будете использовать.
Оцените затраты на разработку в человеко-днях; увеличение показателя RPS в 4 раза, требующее переписывания модулей аутентификации и процессов интеграционного тестирования, не является бесплатным улучшением производительности.
Если вы действительно используете несколько платформ, еженощно запускайте канарейку совместимости, которая тестирует двадцать самых популярных маршрутов на каждой среде выполнения.
Опубликуйте инструменты для тестирования вместе с выводами статьи. Скриншоты показателей RPS, которые невозможно воспроизвести, не должны определять стратегию платформы.
В отчет о результатах тестирования включайте показатели начального запуска и работы через CLI для функций/edge, а не только показатели RPS в устойчивом режиме.
Отслеживайте проблемы совместимости: нативные дополнения, импорты в Node и библиотеки тестирования, которые зависят от глобальных переменных Node.
Для каждой среды выполнения задокументируйте модель процесса развертывания в продакшене (кластер, системный менеджер, механизмы изоляции), которую вы фактически будете использовать.
Оцените затраты на тестирование в человеко-днях; увеличение показателя RPS в 4 раза, требующее переписывания модулей аутентификации и процессов CI, не является бесплатным улучшением производительности.
Если вы действительно используете несколько платформ, еженощно запускайте канарейку совместимости, которая тестирует двадцать самых популярных маршрутов на каждой среде выполнения.
Опубликуйте инструментарий для тестирования вместе с выводами статьи. Скриншоты показателей RPS, которые невозможно воспроизвести, не должны определять стратегию платформы.
Включите показатели запуска приложения с нуля и работу через CLI в систему оценки для функций/краевых узлов, а не только показатели RPS в стабильном режиме.
Отслеживайте проблемы совместимости: нативные дополнения, импорты в Node и библиотеки тестирования, которые полагаются на глобальные переменные Node.
Для каждой среды выполнения задокументируйте модель процесса развертывания в продакшене (кластер, системный менеджер, изоляция), которую вы действительно будете использовать.
Оцените затраты на соревнование в человеко-днях; увеличение показателя RPS в 4 раза, требующее переписывания модулей аутентификации и процессов CI, не является бесплатным улучшением производительности.
Если вы действительно используете несколько платформ, еженощно запускайте канарейку совместимости, которая выполняет двадцать наиболее важных маршрутов в каждой среде выполнения.
Опубликуйте инструментарий для тестирования вместе с выводами статьи. Скриншоты показателей RPS, которые невозможно воспроизвести, не должны определять стратегию платформы.
Включите показатели времени запуска при первом вызове и эффективности работы через CLI в систему оценки для функций/edge, а не только показатель RPS в устойчивом режиме.
Отслеживайте факторы совместимости: нативные дополнения, импорты в Node и библиотеки тестирования, которые предполагают наличие глобальных переменных Node.
Для каждой среды выполнения задокументируйте модель процесса работы в продакшене (кластеры, механизмы контроля, изоляция процессов), которую вы действительно будете использовать.
Оцените затраты на разработку в человеко-днях; увеличение показателя RPS в 4 раза, требующее переписывания модулей аутентификации и систем CI, не является бесплатным улучшением производительности.
Если вы действительно используете несколько сред выполнения, еженощно запускайте тестовый инструмент совместимости, обрабатывающий двадцать наиболее часто используемых маршрутов, в каждой из них.
Опубликуйте инструменты для проведения тестов производительности вместе с выводами статьи. Скриншоты показателей RPS, которые невозможно воспроизвести, не должны определять стратегию развития платформы.
Включите показатели времени запуска при первом вызове и эффективности работы через CLI в систему оценки для функций/edge, а не только показатель RPS в устойчивом режиме.
Отслеживайте проблемы совместимости: встроенные дополнения, операции импорта в Node и библиотеки тестирования, которые опираются на глобальные переменные Node.
Для каждой среды выполнения задокументируйте модель процесса развертывания (кластеры, системы управления, изоляция), которую вы фактически будете использовать.
Оцените затраты на улучшения в человеко-днях; увеличение RPS в 4 раза, требующее переписывания модулей аутентификации и систем CI, не является бесплатным улучшением производительности.
Если вы действительно используете несколько платформ, еженощно запускайте тестовый инструмент совместимости, обрабатывающий двадцать основных маршрутов в каждой среде.
Опубликуйте инструменты для проведения тестов производительности вместе с выводами статьи. Скриншоты показателей RPS, которые невозможно воспроизвести, не должны определять стратегию развития платформы.
В отчет оценки включайте показатели времени запуска при первом вызове и удобства использования CLI для функций/сервисов на краю сети, а не только показатели RPS в стабильном режиме.
Отслеживайте проблемы совместимости: встроенные дополнения, операции импорта в Node и библиотеки тестирования, которые опираются на глобальные переменные Node.
Для каждой среды выполнения необходимо задокументировать модель процесса в продакшене (кластер, супервайзер, изоляция), которая будет фактически использоваться.
Оцените затраты на разработку в единицах инженерных дней; увеличение показателя RPS в 4 раза, требующее переписывания модулей аутентификации и систем CI, не является бесплатным улучшением производительности.
Если вы действительно используете несколько площадок, еженощно запускайте канарейку совместимости, которая обрабатывает двадцать наиболее часто используемых маршрутов в каждой среде выполнения.
Опубликуйте инструменты для тестирования производительности вместе с выводами статьи. Скриншоты показателей RPS, которые невозможно воспроизвести, не должны определять стратегию платформы.
В таблицу оценки функций/решений для края сети включайте показатели холодного запуска и работоспособности через CLI, а не только показатель RPS в устойчивом режиме.
Отслеживайте проблемы совместимости: нативные дополнения, импорты модулей node: и библиотеки тестирования, которые полагаются на глобальные переменные Node.
Для каждой среды выполнения необходимо задокументировать модель процесса в продакшене (кластер, супервайзер, изоляция), которая будет фактически использоваться.
Оцените затраты соревнования в единицах рабочего времени инженеров; увеличение показателя RPS в 4 раза, требующее переписывания модулей аутентификации и CI, не является бесплатным улучшением производительности.
Если вы действительно используете несколько окружений, еженощно запускайте канарейку совместимости, которая выполняет двадцать самых популярных маршрутов в каждом из окружений.
Опубликуйте инструменты для тестирования производительности вместе с выводами статьи. Скриншоты показателей RPS, которые невозможно воспроизвести, не должны определять стратегию платформы.
Включайте в оценку не только показатель RPS в устойчивом режиме, но и время запуска функций/сервисов в состоянии «холодный старт», а также эффективность работы через CLI.
Отслеживайте проблемы совместимости: нативные дополнения, импорты модулей node и библиотеки тестирования, которые зависят от глобальных переменных Node.
Для каждого окружения задокументируйте модель процесса работы в продакшене (кластер, системный менеджер, механизмы изоляции), которую вы фактически будете использовать.
Оцените затраты соревнования в единицах рабочего времени инженеров; увеличение показателя RPS в 4 раза, требующее переписывания модулей аутентификации и CI, не является бесплатным улучшением производительности.
Если вы действительно используете несколько сред выполнения, еженощно запускайте тестовый инструмент совместимости, который обрабатывает двадцать наиболее часто используемых маршрутов в каждой среде.
Опубликуйте инструмент для тестирования вместе с выводами статьи. Скриншоты показателей RPS, которые невозможно воспроизвести, не должны влиять на стратегию платформы.
В отчет о результатах тестирования функций/решений типа edge включайте показатели времени запуска при первом вызове и эффективности работы через командную строку, а не только показатели 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 на ваших реальных маршрутах.