Published on

Thử nghiệm chạy 1 tỷ Request với 5 Web Framework phổ biến

💡 Thực hiện một thử nghiệm táo bạo: chạy 1 tỷ requests qua 5 web frameworks phổ biến để đánh giá khả năng phản ứng dưới áp lực tải cực lớn.

⚠️ Tuyên bố quan trọng trước khi đọc

Đây không phải một bài benchmark đơn thuần. Tác giả đã dựng môi trường production thực tế, tích hợp đầy đủ observability và sử dụng wrk2, k6 để stress test. Mục tiêu chính là xem framework nào thực sự "sống sót" khi gặp massive load.

Các chỉ số như RPS và tiêu thụ bộ nhớ (RSS) chỉ là một phần trong quá trình đánh giá. Việc lựa chọn framework cho dự án cần cân nhắc tổng thể: hệ sinh thái, cộng đồng, tốc độ phát triển, khả năng bảo trì và sự phù hợp với đội ngũ. Kết quả benchmark dưới đây chỉ mang tính chất tham khảo, không nên dùng làm tiêu chí duy nhất để ra quyết định công nghệ.

1️⃣ Danh sách 5 Framework được lựa chọn

Lineup được chọn bao gồm 5 framework phổ biến, đã được kiểm nghiệm thực chiến và được ưa chuộng bởi developer vào năm 2025:

  • Go (Gin): Gọn nhẹ, compiled, nổi tiếng về tốc độ.
  • Rust (Actix-Web): Memory-safe, kiểm soát low-level tốt, thường dẫn đầu các bảng xếp hạng benchmark.
  • Node.js (Fastify): Asynchronous, JavaScript-native, tối ưu hóa tốc độ.
  • Python (FastAPI): Thân thiện với developer, hỗ trợ async.
  • Java (Spring Boot): Phổ biến trong doanh nghiệp, mạnh mẽ nhưng tiêu tốn nhiều RAM.

📌 Mỗi framework được test với một REST endpoint cơ bản, sát với thực tế: parse JSON → truy cập database (PostgreSQL) → trả về JSON response.

2️⃣ Kịch bản & Môi trường Test

🖥️ Hạ tầng

  • VM 4 core, 16GB RAM trên GCP
  • Tất cả service được deploy qua Docker container
  • PostgreSQL sử dụng connection pooling

📊 Công cụ & Phương pháp

  • Sử dụng wrk2 cho load testing với tốc độ không đổi (constant rate)
  • Tải được tăng dần từ 100 đến 100.000 RPS, tổng cộng 1 tỷ request

📈 Các chỉ số giám sát

  • Requests per second (RPS)
  • Latency ở percentile 95 và 99
  • Memory usage (RSS)
  • CPU utilization
  • Error rate dưới áp lực
  • Connection handling & độ ổn định (resilience)

3️⃣ Kết quả thử nghiệm chi tiết

🔹 Go (Gin)

  • Hiệu năng: Duy trì >100.000 RPS, latency luôn < 10ms. Garbage collector ổn định, memory < 200MB.
  • Ưu điểm: Memory footprint cực nhỏ, JSON serialization nhanh, latency tăng rất ít khi chịu tải cao.
  • ⚠️ Nhược điểm: Hệ sinh thái chưa đa dạng bằng Java/Python trong một số lĩnh vực chuyên biệt (dù backend hệ thống rất tốt).

🔹 Rust (Actix-Web)

  • Hiệu năng: Nhanh hơn Go, tail latency thấp nhất (P99 vượt trội). Yêu cầu nhiều boilerplate và tuning.
  • Ưu điểm: Latency tốt nhất ở concurrency cực cao, error rate thấp nhất.
  • ⚠️ Nhược điểm: Độ phức tạp cao, curve học tập dốc (cần làm quen lại tư duy code và memory management).

🔹 Node.js (Fastify)

  • Hiệu năng: Throughput ổn định ~60.000 RPS, xử lý async tốt. Memory 500–700MB, GC gây vài spike nhỏ nhưng không crash.
  • Ưu điểm: Async scalability tốt, xử lý JSON hiệu quả, cộng đồng lớn và tài liệu phong phú.
  • ⚠️ Nhược điểm: Latency spike do GC, tiêu thụ memory cao hơn các ngôn ngữ compiled.

🔹 Python (FastAPI)

  • Hiệu năng: Ổn ở tải thấp, nhưng nghẽn khi >10.000 concurrent requests. CPU max, memory >1.2GB, response time tăng vọt.
  • Ưu điểm: Cú pháp thân thiện, dễ đọc, dễ bảo trì, tích hợp AI/ML thuận lợi.
  • ⚠️ Nhược điểm: Performance giảm mạnh dưới tải đồng thời cao, tiêu tốn nhiều bộ nhớ do GIL và runtime overhead.

🔹 Java (Spring Boot)

  • Hiệu năng: Ổn định nhưng nặng. Cold start chậm, idle >1GB RAM. Cần tối ưu JVM/GC kỹ. Có thể duy trì ~40.000 RPS không lỗi.
  • Ưu điểm: Hệ sinh thái lâu đời, ổn định, đầy đủ tính năng enterprise, bảo mật & quản lý cấu hình tốt.
  • ⚠️ Nhược điểm: Cold start chậm, ngốn tài nguyên, cần cấu hình phức tạp để đạt hiệu năng tối ưu.

4️⃣ Bảng tổng hợp số liệu Benchmark

FrameworkRPS (95% success)Peak Memory (RSS)99th Percentile Latency
Go (Gin)105,000190 MB10 ms
Rust (Actix-Web)110,000250 MB7 ms
Node.js (Fastify)60,000650 MB35 ms
Java (Spring Boot)40,0001.4 GB50 ms
Python (FastAPI)8,0001.2 GB150 ms

5️⃣ Kết luận & Lưu ý

Bài viết đã được điều chỉnh, loại bỏ một số thông tin không chính xác từ bản gốc để đảm bảo tính khách quan và chính xác kỹ thuật. Kết quả trên chỉ phản ánh hiệu năng trong kịch bản test cụ thể (single endpoint, JSON + PostgreSQL, constant rate load).

Trong thực tế, việc lựa chọn công nghệ nên dựa trên:

  • Yêu cầu nghiệp vụ & SLA dự án
  • Năng lực & kinh nghiệm của đội ngũ
  • Chi phí vận hành, bảo trì & scaling
  • Hệ sinh thái & khả năng tích hợp

Benchmark là công cụ tham khảo, không phải thước đo tuyệt đối. Hãy chọn công nghệ phù hợp nhất với bối cảnh thực tế của bạn.

📖 Nguồn tham khảo gốc:
I tried running a billion requests through 5 web frameworks, here's what survived (Medium)


💡 Bài viết đã được tinh chỉnh lại cấu trúc, chuẩn hóa thuật ngữ kỹ thuật và tối ưu định dạng để phù hợp với chuẩn blog kỹ thuật / báo cáo nội bộ.