Link to original video by Anton Putra
Rust vs Go: Performance Benchmark in Kubernetes #205

Tóm tắt ngắn:
- Video là phiên bản cải tiến của bài benchmark so sánh hiệu năng giữa Rust và Go trong môi trường Kubernetes.
- Trọng tâm là so sánh hiệu năng của Rust (Actix) và thư viện chuẩn Go trong hai bài test: một API trả về dữ liệu JSON cứng và một API upload file lên S3 và ghi metadata vào Postgres.
- Kết quả cho thấy Rust có hiệu năng cao hơn Go trong bài test API đơn giản, đặc biệt khi đạt đến tải cao, nhưng Go lại có lợi thế trong bài test upload file do thư viện AWS SDK cho Go được tối ưu hơn.
- Các phương pháp được sử dụng bao gồm đo lường CPU, bộ nhớ, độ trễ, số lượng request/giây, độ khả dụng, và hiện tượng bị Kubernetes throttling. Các chỉ số này được thu thập và hiển thị qua các biểu đồ.
Tóm tắt chi tiết:
Video được chia thành các phần chính sau:
1. Giới thiệu và cải tiến:
- Video là phần tiếp theo của bài benchmark Rust vs Go, được cải tiến dựa trên phản hồi của cộng đồng.
- Thay vì sử dụng Fiber (Go), video này sử dụng thư viện chuẩn Go để so sánh công bằng hơn.
- Mã Rust cũng được cải thiện đáng kể nhờ các góp ý và Pull Request từ cộng đồng, bao gồm tối ưu hóa biên dịch (LTO, codegen-units, panic=abort) và sửa lỗi sử dụng kiểu dữ liệu UUID.
2. So sánh Go (Fiber vs Stdlib):
- Fiber (dựa trên Fasthttp) rất nhanh nhưng chỉ phù hợp với các trường hợp sử dụng cụ thể, đòi hỏi hiệu năng cực cao.
- Thư viện chuẩn Go ổn định hơn, hỗ trợ HTTP/2 và xử lý nhiều trường hợp ngoại lệ tốt hơn.
- Tác giả khuyến nghị sử dụng thư viện chuẩn Go cho hầu hết các dự án, đặc biệt là dự án thương mại.
3. Cải tiến mã Rust:
- Nhiều cải tiến được thực hiện cho mã Rust, bao gồm sử dụng kiểu dữ liệu tối ưu hơn cho UUID (Copy-On-Write).
- Tác giả kêu gọi cộng đồng tiếp tục đóng góp để cải thiện mã nguồn.
4. Bài test thứ nhất (API JSON):
- So sánh hiệu năng của API trả về dữ liệu JSON cứng.
- Rust có độ trễ thấp hơn và xử lý được nhiều request hơn Go (khoảng 25,000 req/s so với 14,000 req/s).
- Go sử dụng nhiều CPU và bộ nhớ hơn Rust.
- Kubernetes throttling được quan sát thấy ở cả hai ứng dụng khi đạt đến tải cao.
- Các chỉ số được đo lường bao gồm: độ trễ, request/giây, độ khả dụng, và CPU throttling. Độ khả dụng giảm khi request bị timeout (408).
5. Bài test thứ hai (Upload file lên S3 và ghi metadata vào Postgres):
- So sánh hiệu năng của API upload file lên S3 và ghi metadata vào Postgres.
- Go có hiệu năng tốt hơn Rust trong việc upload file lên S3, có thể do AWS SDK cho Go được tối ưu hơn.
- Hiệu năng của cả hai ứng dụng gần tương đương nhau khi tải tăng lên.
- Cả hai ứng dụng đều có thể xử lý tối đa khoảng 50 request/giây.
- Tác giả mở lời mời cộng đồng tìm hiểu và tối ưu hóa thêm.
- Các chỉ số được đo lường bao gồm: request/giây, độ trễ client, sử dụng CPU, sử dụng bộ nhớ, độ khả dụng, độ trễ database, và độ trễ S3.
6. Kết luận:
- Rust có hiệu năng tốt hơn Go trong bài test API đơn giản, nhưng Go có lợi thế trong bài test liên quan đến S3.
- Tác giả khuyến khích sử dụng các chỉ số như độ trễ và request/giây để tự động điều chỉnh số lượng pod trong Kubernetes.
- Video kết thúc bằng lời mời gọi cộng đồng đề xuất các bài test tiếp theo.
Tóm lại, video cung cấp một bài benchmark chi tiết và toàn diện về hiệu năng của Rust và Go trong môi trường Kubernetes, nhấn mạnh vào tầm quan trọng của việc tối ưu hóa mã nguồn và lựa chọn công cụ phù hợp cho từng trường hợp sử dụng cụ thể.