Link to original video by Anton Putra

Go (Golang) vs Node.js: Performance (Latency - Throughput - Saturation - Availability)

Outline Video Go (Golang) vs Node.js: Performance (Latency - Throughput - Saturation - Availability)

Tóm tắt ngắn:

Tóm tắt chi tiết:

Video được chia thành các phần chính sau:

1. Giới thiệu: Người thuyết trình giới thiệu về video trước đó so sánh Go và Node.js, thừa nhận những sai sót và cải tiến trong bài kiểm tra lần này. Lần này, một REST API đơn giản được xây dựng bằng thư viện chuẩn của cả hai ngôn ngữ và được triển khai trên cụm EKS để mô phỏng môi trường sản xuất thực tế. Các chỉ số đo lường bao gồm độ trễ p99, số request/giây, sử dụng CPU/bộ nhớ, đồ thị khả dụng và hiện tượng bị Kubernetes bóp nghẹt (throttling).

2. Tổng quan về Node.js: Node.js được mô tả là ứng dụng luồng đơn (single-threaded), mặc dù có thêm 4 luồng phụ trợ cho các tác vụ khác nhau (DNS, hệ thống tập tin, mã hóa, nén). Điểm yếu là chỉ sử dụng hiệu quả một nhân CPU. Hai cách cải thiện hiệu năng trên máy chủ đa nhân được đề xuất: sử dụng chế độ cluster hoặc giới hạn CPU ở 1 và mở rộng ngang (horizontal scaling) trong Kubernetes.

3. Giới hạn và yêu cầu (requests & limits) trong Kubernetes: Phần này giải thích chi tiết về cách Kubernetes sử dụng cgroups để quản lý phân bổ CPU và bộ nhớ. Giới hạn CPU được định nghĩa bằng millicores (1000 millicores = 1 CPU core). Kubernetes sử dụng khoảng thời gian 100ms để phân bổ thời gian CPU cho các ứng dụng. Việc vượt quá giới hạn dẫn đến bị throttling. Người thuyết trình minh họa bằng ví dụ với 1 và 2 CPU core, giải thích cách phân bổ thời gian CPU cho nhiều dịch vụ cùng chạy. Quan trọng là hiểu rằng việc có nhiều luồng hơn số nhân CPU có thể gây ra context switching nhiều hơn, làm giảm hiệu suất.

4. Kiểm tra thứ nhất (Go vs Node.js với cấu hình tối ưu): Cả Go và Node.js được triển khai trên EKS với giới hạn CPU là 1. Kết quả cho thấy Node.js có độ trễ cao hơn một chút nhưng vẫn trong giới hạn chấp nhận được. Golang ban đầu có độ trễ thấp hơn nhưng sau đó tiệm cận với Node.js. Cả hai đều bị throttling khi số lượng request tăng cao. Node.js đạt mức tối đa khoảng 52,000 request/giây, trong khi Golang đạt khoảng 70,000 request/giây. Node.js cần được mở rộng ngang để tối ưu hiệu năng.

5. Kiểm tra thứ hai (Go với cấu hình mặc định vs cấu hình tối ưu): So sánh Go với cấu hình mặc định (không thiết lập GOMAXPROCS) và cấu hình tối ưu (GOMAXPROCS được thiết lập bằng số nhân CPU). Kết quả cho thấy Go với cấu hình tối ưu có hiệu năng tốt hơn đáng kể (khoảng 70,000 request/giây so với 53,000 request/giây của cấu hình mặc định). Cấu hình mặc định bị throttling nhiều hơn do quá nhiều luồng.

6. Kết luận: Golang cho thấy hiệu năng tốt hơn, đặc biệt khi được cấu hình đúng cách. Node.js vẫn cạnh tranh được nhưng cần chú ý đến việc mở rộng ngang và tự động mở rộng (autoscaling). Việc hiểu cách Kubernetes quản lý giới hạn CPU rất quan trọng để tối ưu hiệu năng ứng dụng. Người thuyết trình nhấn mạnh tầm quan trọng của việc thiết lập GOMAXPROCS trong Go để phù hợp với số nhân CPU.