Link to original video by Anton Putra
Node.js vs Go (Golang): Performance (Latency - Throughput - Saturation - Availability)

Tóm tắt ngắn:
- Video so sánh hiệu năng của Node.js và Go (Golang) trong việc xây dựng ứng dụng web, tập trung vào độ trễ, thông lượng, điểm bão hòa và khả năng sẵn sàng.
- Sử dụng Kubernetes trên AWS với các instance EC2 thế hệ mới để triển khai và thử nghiệm cả hai ứng dụng. Các chỉ số được đo đạc bao gồm sử dụng CPU, bộ nhớ, khả năng sẵn sàng, giới hạn CPU bởi Kubernetes, áp lực mạng, và lượng dữ liệu truyền nhận. Cả hai ứng dụng đều được thử nghiệm với và không có lớp lưu trữ dữ liệu (Postgres).
- Kết quả cho thấy Go có hiệu năng vượt trội so với Node.js, xử lý được lượng request lớn hơn nhiều trước khi gặp sự cố. Node.js cho thấy điểm yếu về khả năng xử lý request lớn và quản lý tài nguyên.
- Phương pháp thử nghiệm bao gồm tăng dần số lượng request cho đến khi ứng dụng gặp lỗi, sử dụng Kubernetes Jobs và Postgres làm cơ sở dữ liệu.
Tóm tắt chi tiết:
Video được chia thành hai phần chính: phần thử nghiệm đầu tiên (không có cơ sở dữ liệu) và phần thử nghiệm thứ hai (có cơ sở dữ liệu Postgres).
Phần 1: Thử nghiệm không có cơ sở dữ liệu:
- Hai ứng dụng web, một được viết bằng Node.js (sử dụng Express.js) và một bằng Go (sử dụng thư viện chuẩn), được triển khai trên cụm Kubernetes trên AWS.
- Các chỉ số hiệu năng như sử dụng CPU, bộ nhớ, khả năng sẵn sàng, giới hạn CPU, áp lực mạng và lượng dữ liệu truyền nhận được theo dõi.
- Thử nghiệm được thực hiện bằng cách tăng dần số lượng request cho đến khi cả hai ứng dụng bắt đầu gặp lỗi. Thời gian chờ (timeout) được đặt là 1 giây.
- Kết quả cho thấy Go có hiệu năng tốt hơn đáng kể so với Node.js. Go xử lý được khoảng 70,000-80,000 request/giây trước khi bị OOM-killed (out of memory) bởi Kubernetes, trong khi Node.js chỉ xử lý được khoảng 9,000 request/giây trước khi bị tắc nghẽn ở mức sử dụng CPU 60%. Độ trễ của Node.js cũng cao hơn đáng kể so với Go. Node.js cũng sử dụng nhiều bộ nhớ hơn và truyền nhiều dữ liệu hơn do gửi nhiều header hơn. Người thuyết trình đề cập đến việc có thể sử dụng chế độ cluster cho Node.js nhưng cho rằng tăng số lượng replica sẽ hiệu quả hơn.
Phần 2: Thử nghiệm có cơ sở dữ liệu Postgres:
- Thêm một lớp lưu trữ dữ liệu bằng Postgres vào cả hai ứng dụng. Ứng dụng nhận request POST với payload JSON, tạo UUID và lưu vào cơ sở dữ liệu.
- Kích thước pool kết nối tối đa được đặt là 20 cho cả hai ứng dụng. Người thuyết trình sử dụng Docker image Postgres và init container để chạy migration.
- Kết quả cho thấy độ trễ chèn dữ liệu ban đầu tương đối giống nhau giữa hai ứng dụng, nhưng Node.js lại nhanh chóng bị tắc nghẽn ở mức 60% sử dụng CPU và độ trễ tăng cao khi đạt khoảng 4,000 request/giây. Go đạt đến điểm bão hòa ở khoảng 7,000 request/giây. Cả hai ứng dụng đều nhanh chóng sử dụng hết pool kết nối.
Kết luận:
Video chứng minh Go có hiệu năng vượt trội so với Node.js trong cả hai trường hợp có và không có cơ sở dữ liệu, đặc biệt về khả năng xử lý lượng request lớn và quản lý tài nguyên hiệu quả hơn. Người thuyết trình khuyến khích người xem gửi pull request nếu có đề xuất cải thiện ứng dụng.