Quay lại danh sách
Tin tức công nghệ

Tối ưu hóa Node.js REST API đạt mốc 80k RPS trên VPS 1 vCPU: Hành trình chuyển dịch sang Bun và ElysiaJS

30 tháng 5, 2026

Giới thiệu: Bài toán hiệu năng trên tài nguyên hạn chế

Trong kỷ nguyên điện toán đám mây, việc tối ưu hóa chi phí hạ tầng trong khi vẫn đảm bảo trải nghiệm người dùng mượt mà là một trong những thách thức lớn nhất của các kỹ sư phần mềm và kiến trúc sư hệ thống. Thông thường, khi một ứng dụng Node.js REST API đối mặt với lượng truy cập tăng đột biến, giải pháp đầu tiên được nghĩ đến là nâng cấp cấu hình phần cứng (Scale-up) hoặc bổ sung thêm instance (Scale-out). Tuy nhiên, các giải pháp này trực tiếp làm tăng chi phí vận hành doanh nghiệp.

Bài viết này sẽ chia sẻ một cách tiếp cận mang tính đột phá hơn: Tối ưu hóa từ lõi runtime và framework. Chúng ta sẽ cùng phân tích hành trình chuyển dịch hệ thống từ Node.js (Express/Fastify) truyền thống sang Bun và ElysiaJS, qua đó giúp một ứng dụng REST API chạy trên cấu hình VPS khiêm tốn (1 vCPU, 2GB RAM) có thể xử lý thành công mốc 80.000 Requests Per Second (RPS).

Sự hạn chế về mặt kiến trúc của Node.js trong kỷ nguyên mới

Node.js đã thống trị thế giới server-side JavaScript hơn một thập kỷ qua nhờ vào mô hình Event Loop và Non-blocking I/O mạnh mẽ. Tuy nhiên, kiến trúc của Node.js được xây dựng từ năm 2009 dựa trên engine V8 của Google, mang theo những gánh nặng công nghệ (legacy debt) nhất định:

  • V8 Engine và rào cản tối ưu: V8 rất xuất sắc cho trình duyệt, nhưng đối với môi trường server đòi hỏi mật độ xử lý I/O cực cao, nó tiêu tốn lượng bộ nhớ lớn cho việc quản lý bộ nhớ (Garbage Collection) và context-switching.
  • Tương thích CommonJS và ESM: Sự phân mảnh giữa hai hệ thống module này tạo ra nhiều tầng wrapper phức tạp khi khởi chạy ứng dụng.
  • Chi phí từ Framework cũ: Các framework phổ biến như ExpressJS dựa trên cơ chế middleware đồng bộ, không tối ưu tốt cho luồng dữ liệu hiện đại và thiếu khả năng tự động tối ưu hóa tĩnh (Static Analysis).

Bun và ElysiaJS: Cặp bài trùng thay đổi cuộc chơi

1. Bun Runtime - Khi tốc độ được đặt lên hàng đầu

Không giống như Node.js, Bun được viết từ đầu bằng ngôn ngữ lập trình hệ thống Zig và sử dụng engine JavaScriptCore (JSC) của WebKit thay vì V8. JSC mang lại tốc độ khởi động nhanh hơn đáng kể và mức độ tiêu thụ bộ nhớ thấp hơn. Bun không chỉ là một runtime mà còn tích hợp sẵn cả bundler, test runner, và package manager siêu tốc, giúp loại bỏ hoàn toàn các overhead không cần thiết.

2. ElysiaJS - Khả năng tối ưu hóa tĩnh tối đa

ElysiaJS là một framework Web được thiết kế chuyên biệt cho Bun. Sức mạnh của ElysiaJS đến từ khả năng thực hiện Static Code Analysis (Phân tích mã nguồn tĩnh). Khi ứng dụng khởi chạy, ElysiaJS sẽ phân tích các router và tối ưu hóa trước luồng xử lý HTTP (Ahead-Of-Time compilation), chuyển đổi code JavaScript của bạn thành các hàm tối ưu ở mức mã máy mà không cần thực hiện lại các bước kiểm tra route động cho mỗi request.

"ElysiaJS kết hợp cùng Bun đem lại hiệu năng tiệm cận với các ngôn ngữ biên dịch như Go hay Rust, nhưng vẫn giữ được sự linh hoạt và tốc độ phát triển cực nhanh của hệ sinh thái JavaScript."

Chiến lược triển khai và Chuyển dịch hệ thống

Để đạt được cột mốc 80.000 RPS trên 1 vCPU, quá trình chuyển dịch không chỉ đơn thuần là cài đặt framework mới mà cần tuân thủ các bước tối ưu hóa nghiêm ngặt sau:

Bước 1: Tối ưu hóa Schema Validation với TypeBox

ElysiaJS tích hợp sâu với TypeBox để kiểm thử dữ liệu đầu vào. Việc định nghĩa schema rõ ràng giúp cấu trúc dữ liệu được định hình trước trong bộ nhớ, giảm thiểu thời gian parse JSON.

Bước 2: Triển khai Kết nối Không chặn (End-to-End Type Safety)

Sử dụng giao thức HTTP/1.1 Keep-Alive kết hợp với HTTP/2 để giảm bớt chu trình bắt tay TCP (TCP handshake) liên tục. Mỗi kết nối được tái sử dụng tối đa, giảm tải cực lớn cho CPU đơn nhân.

Bước 3: Sử dụng các API gốc (Native APIs) của Bun

Thay vì sử dụng các thư viện bên thứ ba cho các tác vụ như băm mật khẩu, đọc file, hay quản lý môi trường, chúng tôi chuyển hoàn toàn sang các hàm native như Bun.password, Bun.file(). Các hàm này được viết bằng Zig và tối ưu hóa trực tiếp ở tầng nhân hệ điều hành.

Kết quả Benchmark hiệu năng thực tế

Quá trình kiểm thử tải (Load Testing) được thực hiện bằng công cụ wrk từ một server độc lập trong cùng mạng nội bộ để đảm bảo không bị nghẽn băng thông mạng. Cấu hình VPS mục tiêu: 1 vCPU, 2GB RAM Linux Ubuntu 22.04.

  1. Kịch bản ExpressJS trên Node.js v20: Đạt trung bình 12.500 RPS. CPU duy trì ở mức 100%, RAM tiêu thụ khoảng 180MB.
  2. Kịch bản Fastify trên Node.js v20: Cải thiện rõ rệt, đạt 28.000 RPS nhờ kiến trúc schema tối ưu của Fastify.
  3. Kịch bản ElysiaJS trên Bun: Đạt mốc kỷ lục 81.200 RPS. CPU đạt ngưỡng tối đa nhưng lượng RAM tiêu thụ cực kỳ ổn định ở mức dưới 90MB. Độ trễ (Latency) ở phân vị thứ 99 (p99) giảm từ 45ms xuống còn vỏn vẹn 2.4ms.

Bài học kinh nghiệm và Những lưu ý cho doanh nghiệp

Mặc dù việc chuyển dịch mang lại hiệu năng vượt trội, các doanh nghiệp cần cân nhắc các yếu tố sau trước khi đưa vào môi trường Production:

  • Mức độ trưởng thành của hệ sinh thái: Bun hiện tại đã đạt độ ổn định cao, tuy nhiên một số thư viện Node.js lâu đời (đặc biệt là các thư viện sử dụng Native C++ Addons) có thể cần thời gian để tương thích hoàn toàn.
  • Khả năng debug: Do cấu trúc tối ưu hóa tĩnh và chạy trên JavaScriptCore, các công cụ debug truyền thống của Chrome DevTools có một số khác biệt nhất định khi thiết lập.

Lời kết

Chuyển dịch sang Bun và ElysiaJS không chỉ là một xu hướng công nghệ thuần túy, mà là một giải pháp chiến lược giúp doanh nghiệp tiết kiệm hàng ngàn USD chi phí hạ tầng máy chủ hàng tháng. Con số 80k RPS trên 1 vCPU chứng minh rằng, với một kiến trúc đúng đắn và sự lựa chọn công nghệ hợp lý, giới hạn phần cứng hoàn toàn có thể bị phá bỏ. Đây là thời điểm chín muồi để các nhà phát triển nghiêm túc cân nhắc Bun cho các dự án microservices và API thế hệ mới của mình.

Tối ưu hóa Node.js REST API đạt mốc 80k RPS trên VPS 1 vCPU: Hành trình chuyển dịch sang Bun và ElysiaJS | DPTCloud