Node kontra Bun kontra Deno: porównania wielu tras przewyższają wykresy pojedynczego RPS
Konkurencja wielokierunkowa Node.js vs Bun vs Deno: surowa przepustowość jest rzeczywista, ale znajomość narzędzi przez administratorów, uprawnienia, pamięć oraz trasy zależne od bazy danych decydują o architekturze.
Źródła: I Rebuilt the Same API on Node.js, Bun, and Deno. The Surprising Difference Wasn’t Throughput
Miernik, który ma znaczenie, posiada więcej niż jedną ścieżkę
Wykresy RPS dla czystego HTTP sprawiły wrażenie, że wyścig jest zakończony: Bun daleko na czele, Deno zaraz za nim, Node z tyłu. Decyzje architektoniczne wymagają czegoś więcej niż pojedynczej syntetycznej ścieżki.
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
Surowa przepustowość była rzeczywista, ale nie decydowała już o architekturze
Przepustowość ma znaczenie na skraju krzywych kosztów. Większość API biznesowych jest ograniczana przez bazy danych, mechanizmy autoryzacji oraz operacje wejścia/wyjścia na długo przed osiągnięciem limitów RPS w czasie działania.
Node był najmniej interesującym środowiskiem działania, co było komplementem
Grawitacja ekosystemu Node, znajomość jego mechanizmów operacyjnych oraz przewidywalność procesu wdrażania nadal sprawiają, że jest on preferowany jako platforma domyślna. Nuda jest zaletą, gdy czas reakcji na awarie jest ograniczony.
Bun był najszybszy, gdy mógł być sobą
Bun wyróżnia się własnymi API i narzędziami. Przymusowe dostosowywanie do standardów Node podważa jego przewagę; należy uczciwie ocenić założenia typowe dla Bun.
Deno uczynił uprawnienia i telemetrykę częścią projektowania aplikacji
Model uprawnień Deno oraz jego standardowa biblioteka sprawiają, że bezpieczeństwo i możliwości monitorowania są integralną częścią środowiska wykonawczego, a nie tylko dodatkowym elementem pośredniczącym.
Tutaj zwycięzcy się zlewają
Kwestie takie jak alokacja pamięci, procesy czyszczenia pamięci oraz jej zużycie przy realistycznych obciążeniach są ważniejsze niż maksymalna liczba zapytań na sekundę. Aplikacje o słabej efektywności pamięci stają się również kosztownymi rozwiązaniami w kontenerach.
Prostota operacyjna zależy od tego, co już posiadasz
Jeśli organizacja już używa Node na Kubernetes z rozwiniętymi panelami analitycznymi, zmiana środowiska wykonawczego obciąży wszystkich. W przypadku nowych projektów lub aplikacji pracujących na brzegu sieci, Bun/Deno zasługują na porównania przy użyciu testów **multi-route**: API JSON, dane wielostronne, WebSocket oraz obsługa związana z bazami danych.
Zakończenie
Odbuduj tę samą API w różnych środowiskach wykonawczych, aby poznać różnice pomiędzy nimi – a nie po to, by na podstawie jednego testu obciążenia HTTP wybrać „wiecznego zwycięzcę”. Wybierz środowisko, które pasuje do Twoich potrzeb operacyjnych, uprawnień oraz rzeczywistych ograniczeń.
Opublikuj narzędzie do pomiarów wraz z wnioskami wynikającymi z artykułu. Zdjęcia ekranu pokazujące niemożliwe do powtórzenia wartości RPS nie powinny kształtować strategii platformy.
W ocenie funkcji/edge uwzględnij również czas uruchomienia na początku oraz wydajność interfejsu wiersza poleceń, a nie tylko wartość RPS w stanie stabilnym.
Bądź świadomy ograniczeń związanych z kompatybilnością: dodatków natywnych, importów typu node: oraz bibliotek testowych, które zakładają dostęp do globalnych zmiennych Node’a.
Dla każdego środowiska wykonawczego udokumentuj model procesu produkcyjnego (klaster, supervisor, izolacje), który faktycznie zostanie wdrożony.
Oceń koszt realizacji tego projektu w jednostkach dni inżynierskich; 4-krotny wzrost wartości RPS, który wymaga przepisania modułów autoryzacji i procesów CI, nie jest bezkosztowym ulepszeniem wydajności.
Zachowaj kanarka kompatybilności, który co noc uruchamia dwadzieścia najważniejszych tras na każdym środowisku wykonawczym, jeśli faktycznie korzystasz z wielu lokalizacji.
Opublikuj narzędzie do pomiarów wraz z wnioskami wynikającymi z artykułu. Zdjęcia ekranu przedstawiające niemożliwe do odtworzenia wartości RPS nie powinny kształtować strategii platformy.
W kartce ocenowej funkcji/edge uwzględnij czas uruchomienia od zera oraz wydajność interfejsu wiersza poleceń, a nie tylko wartość RPS w stanie stabilnym.
Bądź świadomy problemów z kompatybilnością: dodatków natywnych, elementów typu node: imports oraz bibliotek testowych, które zakładają dostęp do globalnych zmiennych Node.
Dla każdego środowiska wykonawczego udokumentuj model procesu produkcyjnego (klaster, supervisor, izolacje), który faktycznie zostanie wdrożony.
Oceń koszt konkursu w jednostkach dni inżynierskich; wzrost wartości RPS czterokrotnie, który wymaga przepisania modułów autoryzacji i procesów CI, nie jest bezkosztowym ulepszeniem wydajności.
Zachowaj kanarka kompatybilności, który co noc uruchamia dwadzieścia najważniejszych tras na każdym środowisku wykonawczym, jeśli faktycznie korzystasz z wielu lokalizacji.
Opublikuj narzędzie do testów wydajności wraz z wnioskami z artykułu. Zrzuty ekranu pokazujące niemożliwe do odtworzenia wartości RPS nie powinny kształtować strategii platformy.
W kartce ocenowej dla funkcji/edge uwzględnij czas uruchomienia na początku oraz możliwości CLI DX, a nie tylko wartość RPS w stanie stabilnym.
Śledź ograniczenia związane z kompatybilnością: dodatki natywne, elementy typu node: imports oraz biblioteki testowe, które zakładają dostęp do globalnych zmiennych Node.
Dla każdego środowiska wykonawczego udokumentuj model procesu produkcyjnego (klaster, supervisor, izolacje), który faktycznie zostanie wdrożony.
Oceń koszt konkursu w jednostkach czasu inżynierskiego; wzrost wartości RPS czterokrotnie, który wymaga przepisania modułów autoryzacji i procesów CI, nie jest bezkosztowym ulepszeniem wydajności.
Jeśli naprawdę korzystasz z kilku środowisk, utrzymuj „kanarka kompatybilności”, który co noc uruchamia dwadzieścia najważniejszych tras w każdym środowisku.
Opublikuj narzędzie do testów wydajności wraz z wnioskami z artykułu. Zrzuty ekranu pokazujące niemożliwe do odtworzenia wartości RPS nie powinny kształtować strategii platformy.
Należy uwzględnić czas uruchomienia na zimno oraz wydajność interfejsu CLI w ocenie funkcji/edge, a nie tylko wartość RPS w stanie stabilnym.
Należy śledzić aspekty związane z kompatybilnością: dodatki natywne, elementy typu node:imports oraz biblioteki testowe, które zakładają dostęp do globalnych zmiennych Node’a.
Dla każdego środowiska wykonawczego należy udokumentować model procesu produkcyjnego (klaster, supervisor, izolacje), który faktycznie zostanie wdrożony.
Należy oszacować koszt rozwiązań w jednostkach dni inżynierskich; wzrost RPS czterokrotnie nie oznacza bezkosztowego poprawy wydajności, jeśli wymaga to przepisania modułów autoryzacji i procesów CI.
Jeśli rzeczywiście korzystasz z kilku środowisk, należy utrzymywać „kanarka kompatybilności”, który co noc uruchamia dwadzieścia najważniejszych tras w każdym środowisku.
Należy opublikować narzędzie do pomiarów wydajności wraz z wnioskami wynikającymi z artykułu. Zdjęcia ekranu pokazujące wartości RPS, których nie da się powtórzyć, nie powinny kształtować strategii platformy.
Należy uwzględnić czas uruchomienia na zimno oraz wydajność interfejsu CLI w ocenie funkcji/edge, a nie tylko wartość RPS w stanie stabilnym.
Nadzoruj kompatybilność narzędzi: wbudowane dodatki, operacje importu w Node oraz biblioteki testowe, które zakładają dostęp do globalnych zmiennych Node.
Dla każdego środowiska wykonawczego udokumentuj model procesu produkcyjnego (klaster, supervisor, izolacje), który faktycznie zostanie wdrożony.
Oceń koszt rozwiązania w jednostkach dni inżynierskich; 4-krotny wzrost RPS, który wymaga przepisania modułów autoryzacji i procesów CI, nie stanowi bezkosztowego ulepszenia wydajności.
Jeśli rzeczywiście korzystasz z kilku środowisk, utrzymuj „kanarka kompatybilności”, który co noc uruchamia dwadzieścia najważniejszych tras w każdym środowisku.
Opublikuj narzędzie do pomiarów wydajności wraz z wnioskami wynikającymi z artykułu. Zdjęcia ekranu przedstawiające niemożliwe do powtórzenia wartości RPS nie powinny kształtować strategii platformy.
W ocenie funkcji/edge uwzględnij czas uruchomienia na początku oraz wygodę używania interfejsu CLI, a nie tylko wartość RPS w stanie stabilnym.
Nadzoruj kompatybilność narzędzi: wbudowane dodatki, operacje importu w Node oraz biblioteki testowe, które zakładają dostęp do globalnych zmiennych Node.
Dla każdego środowiska wykonawczego udokumentuj model procesu produkcyjnego (klaster, nadzorca, izolacje), który faktycznie zostanie wdrożony.
Oceń koszt konkursu w jednostkach czasu inżynierskiego; 4-krotny wzrost RPS, który wymaga przepisania modułów autoryzacji i procesów CI, nie stanowi darmowego wzrostu wydajności.
Jeśli rzeczywiście korzystasz z kilku lokalizacji, utrzymuj „canary” kompatybilności, który co noc uruchamia dwadzieścia najważniejszych tras w każdym środowisku.
Opublikuj narzędzie do pomiarów wydajności wraz z wnioskami wynikającymi z artykułu. Zrzuty ekranu pokazujące niemożliwe do powtórzenia wartości RPS nie powinny kształtować strategii platformy.
W kartce ocenowej dla funkcji/edge uwzględnij czas uruchamiania na początku oraz wydajność interfejsu CLI, a nie tylko wartość RPS w stanie stabilnym.
Śledź problemy z kompatybilnością: dodatki natywne, elementy typu node: imports oraz biblioteki testowe, które zakładają dostęp do globalnych zmiennych Node’a.
Dla każdego środowiska wykonawczego udokumentuj model procesu produkcyjnego (klaster, nadzorca, izolacje), który faktycznie zostanie wdrożony.
Koszt konkursu należy obliczać w dniach inżynierskich; zwycięstwo o 4× wyższym RPS, które wymaga przepisania modułów autoryzacji i CI, nie jest bezkosztowym wzrostem wydajności.
Jeśli naprawdę korzystasz z kilku środowisk, utrzymuj „canary” zapewniający kompatybilność, który co noc uruchamia dwadzieścia najważniejszych tras.
Opublikuj narzędzie do pomiarów wraz z wnioskami wynikającymi z artykułu. Zdjęcia ekranu przedstawiające niemożliwe do powtórzenia wartości RPS nie powinny kształtować strategii platformy.
W kartce ocenowej funkcji/edge uwzględnij nie tylko wartość RPS w stanie stabilnym, ale także czas uruchamiania na początku oraz wydajność interfejsu CLI.
Bądź świadomy problemów związanych z kompatybilnością: dodatków natywnych, poleceń node: imports oraz bibliotek testowych, które zakładają dostęp do globalnych zmiennych Node.
Dla każdego środowiska udokumentuj model procesu produkcyjnego (klaster, supervisor, izolacje), który faktycznie zostanie wdrożony.
Koszt konkursu należy obliczać w dniach inżynierskich; zwycięstwo o 4× wyższym RPS, które wymaga przepisania modułów autoryzacji i CI, nie jest bezkosztowym wzrostem wydajności.
Jeśli naprawdę korzystasz z kilku środowisk, utrzymuj „kanarka kompatybilności”, który co noc uruchamia dwadzieścia najważniejszych tras w każdym środowisku.
Opublikuj narzędzie do pomiarów wraz z wnioskami wynikającymi z artykułu. Zdjęcia ekranu pokazujące niemożliwe do powtórzenia wartości RPS nie powinny kształtować strategii platformy.
W kartce ocenowej dla funkcji/edge uwzględnij czas uruchomienia po raz pierwszy oraz wydajność interfejsu wiersza poleceń, a nie tylko wartość RPS w stanie stabilnym.
Pomiary wielu tras powinny obejmować autoryzowane żądania JSON POST, granice przesyłania plików oraz ścieżki ORM – to tam środowiska różnią się po prostych żądaniach GET typu „hello-world”.
Grafy umiejętności zespołu są istotne: sukces z użyciem Bun, który powoduje, że połowa pracowników ma trudności z nieznajomym oprogramowaniem do testowania, stanowi opóźniony awarię.
Bądź uważny na implementacje TLS i HTTP/2; mikropomiary przeprowadzane przy zwykłym HTTP pomijają koszty zakończenia połączeń w architekturze typu mesh.
Rozmiar obrazów kontenerowych oraz wyniki skanowania CVE różnią się w zależności od bazowych obrazów środowisk – dział operacyjny weźmie to pod uwagę razem z wartością RPS.
Testy kontraktów oparte na OpenAPI zapewniają uczciwość w porównaniach, gdy obsługi przesyłek zmieniają się między portami.
Należy rejestrować opóźnienie p99 w warunkach obciążenia, a nie tylko średnią wartość RPS; planery zadaniów ukrywają różne zachowania w przypadku dużych obciążeń.
Jeśli zastosujesz uprawnienia Deno, przekształć każde z nich w запис o decyzji architektonicznej, aby przyszłe usługi nie potajemnie rozszerzały zakres działań sandboxu.
Słoj kompatybilności Bun z npm wymaga wyraźnej listy pakietów dozwolonych i zabronionych, których nie będziesz używać w środowisku produkcyjnym.
Node pozostaje bazą referencyjną pod względem kompatybilności: mierz inne rozwiązania jako różnice w stosunku do Node na twoich rzeczywistych trasach przesyłania danych.
Przeglądaj tę decyzję co kwartał; wyniki w czasie rzeczywistym się zmieniają, podobnie jak twoje wąskie gardła.
Testy wielotorowe powinny obejmować autoryzowane żądania JSON POST, granice przesyłania plików oraz ścieżki z użyciem ORM – to tam rozwiązania różnią się po prostych żądaniach GET typu „hello-world”.
Grafiki umiejętności zespołu są ważne: sukces Bun, który powoduje, że połowa personelu pracuje z nieznajomymi narzędziami testowymi, to opóźniona awaria.
Należy obserwować warstwy TLS i HTTP/2; mikropomiary przeprowadzone przy zwykłym HTTP pomijają koszty zakończenia transmisji w sieci mesh.
Rozmiar obrazów kontenerowych oraz wyniki skanowania CVE różnią się w zależności od używanych obrazów bazowych – specjaliści ds. operacyjnych będą brać to pod uwagę razem z wartościami RPS.
Testy kontraktowe oparte na OpenAPI zapewniają uczciwość w porównaniach, gdy obsługi zmieniają się między różnymi portami.
Należy rejestrować wartość opóźnienia p99 w warunkach obciążenia, a nie tylko medianę RPS; planery zadaniów ukrywają różnice w zachowaniu systemu przy dużym obciążeniu.
Jeśli zastosujesz uprawnienia Deno, przekształć każde z nich na zapis decyzji architektonicznej, aby przyszłe usługi nie potajemnie rozszerzały zakres działań sandboxu.
Słownik kompatybilności npm w Bun wymaga wyraźnej listy pakietów dozwolonych/dozwolonych, których nie będzie się używać w środowisku produkcyjnym.
Node pozostaje podstawą kompatybilności: mierz inne rozwiązania jako różnice względem Node na swoich rzeczywistych trasach.
Przeglądaj tę decyzję co kwartał; wyniki pomiarów czasu działania się zmieniają, podobnie jak twoje wąskie gardła.
Testy wielotrasowe powinny obejmować autoryzowane żądania JSON POST, granice przesyłania plików oraz ścieżki ORM – to tam różnice w czasie działania po prostych żądaniach GET typu „hello-world” stają się widoczne.
Grafy umiejętności zespołu są ważne: sukces z użyciem Bun, który powoduje, że połowa pracowników musi korzystać z nieznanej aparatury testowej, to w rzeczywistości opóźniona awaria.
Bądź uważny na implementacje TLS i HTTP/2; mikrotesty przeprowadzane przy zwykłym HTTP pomijają koszty zakończenia połączeń w architekturze typu mesh.
Rozmiar obrazów kontenerowych oraz wyniki skanowania CVE różnią się w zależności od używanych obrazów bazowych – działania operacyjne będą brać to pod uwagę razem z wartością RPS.
Testy kontraktowe oparte na OpenAPI zapewniają uczciwość w porównaniach, gdy obsługi żądań zmieniają się między różnymi portami.
Zapisuj latencję p99 w warunkach konkurencji, a nie tylko medianę RPS; planery zadaniów ukrywają różne zachowania na końcu rozkładu.
Jeśli przyjmiesz uprawnienia Deno, przekształć każde z nich na запис decyzji architektonicznych, aby przyszłe usługi nie powiększały w tle zakresu dostępnych zasobów.
Słoj kompatybilności npm w Bun wymaga wyraźnej listy pakietów dozwolonych/dozwolonych, których nie będziesz używać w środowisku produkcyjnym.
Node pozostaje bazą referencyjną pod względem kompatybilności: mierz inne rozwiązania jako różnice w stosunku do Node na twoich rzeczywistych trasach.