Với một dịch vụ HTTP thông thường, cả Go lẫn Rust đều thừa sức — cả hai đều nhanh, đều có hệ sinh thái mạng trưởng thành, đều chạy ổn định dưới tải cao. Chọn sai không làm dự án chết. Nhưng chọn đúng tiết kiệm đáng kể công sức trong suốt vòng đời dự án, và điều đáng tiếc là quyết định này thường được đưa ra vì lý do tình cảm ("tôi thích ngôn ngữ này") thay vì vì ràng buộc thật. Đây là các trục nên cân nhắc.
Tốc độ đưa người mới vào việc
Go thắng rõ ràng, và đây không phải chuyện nhỏ. Ngôn ngữ được thiết kế cố tình ít tính năng — ít đến mức nhiều lập trình viên kỳ cựu thấy bực — nhưng chính sự tối giản đó khiến một người biết ngôn ngữ khác đọc hiểu được mã Go trong vài ngày và viết được trong vài tuần. Rust cần vài tháng để thật sự thoải mái với quyền sở hữu và vòng đời, giai đoạn mà năng suất tụt xuống trước khi bật lên. Với một đội hay thay người, hoặc một dự án mà nhiều người chỉ ghé qua sửa vài chỗ rồi đi, đây thường là yếu tố nặng ký nhất — nặng hơn mọi con số hiệu năng.
Độ trễ đuôi
Go có bộ gom rác. Bộ gom hiện đại của nó đã rất tốt, khoảng dừng thường dưới một mili giây — nhưng nó vẫn tồn tại, và có xu hướng tăng lên khi đống bộ nhớ lớn dần. Rust không có khoảng dừng nào, vì nó không có bộ gom. Sự khác biệt này chỉ quyết định trong đúng một tình huống: khi yêu cầu của bạn là "99,9% số yêu cầu phải trả lời dưới ngưỡng X" và ngưỡng đó chặt. Ở đó, một cú dừng gom rác 2ms đúng lúc xấu có thể phá vỡ cam kết. Nhưng nếu chỉ số bạn thật sự quan tâm là trung vị — như phần lớn dịch vụ — thì khác biệt này gần như vô hình, và đừng để nó chi phối quyết định.
Bộ nhớ và chi phí máy chủ
Dịch vụ Rust thường dùng ít RAM hơn đáng kể, vì nó không cần khoảng đệm dư mà bộ gom rác đòi hỏi để hoạt động hiệu quả. Ở quy mô vài máy chủ, khác biệt này không đáng để đưa vào cân nhắc — tiền lương một tuần của lập trình viên còn lớn hơn khoản RAM tiết kiệm được cả năm. Nhưng ở quy mô hàng nghìn máy chạy cùng một dịch vụ, cùng một phần trăm RAM tiết kiệm nhân lên thành một khoản thật, và lúc đó phép tính đảo chiều.
Gợi ý gọn
- Dịch vụ nghiệp vụ, API nội bộ, công cụ vận hành — Go, gần như luôn là lựa chọn đúng. Tốc độ viết và dễ bảo trì thắng mọi thứ khác ở đây.
- Thành phần nằm trên đường đi nóng — proxy, cân bằng tải, xử lý luồng dữ liệu lớn liên tục — Rust trả lại công sức bỏ ra học nó.
- Đội chưa ai biết cả hai — bắt đầu với Go, và chỉ chuyển sang Rust khi gặp một giới hạn thật đo được, chứ không phải một giới hạn tưởng tượng. Tối ưu cho một vấn đề bạn chưa có là cách chắc chắn để làm chậm dự án hiện tại.
Thảo luận