- Giới thiệu chiến lược bổ sung Rust theo từng bước vào các máy chủ không dùng Rust (JavaScript, Python, Java, v.v.)
- Mục tiêu là xác định các hàm nóng không đáp ứng được yêu cầu hiệu năng do nút thắt CPU, rồi thay thế phần triển khai của chúng bằng Rust
- Chiến lược được chia theo các Tier (mức độ áp dụng Rust), trong đó Tier 0 là không dùng Rust, còn Tier cuối cùng là viết lại toàn bộ máy chủ bằng Rust
Chiến lược
Tier 0: Không dùng Rust
- Triển khai endpoint tạo mã QR trên máy chủ Node.js
- Hiệu năng cơ sở: 1464 yêu cầu/giây, độ trễ trung bình 68ms, độ trễ p99 96ms, kích thước phản hồi trung bình 1506 byte, bộ nhớ 1353MB
Tier 1: Công cụ CLI Rust
- Viết lại hàm tạo mã QR bằng Rust và biên dịch thành công cụ CLI
- Gọi công cụ CLI từ máy chủ host
- Hiệu năng so với mức cơ sở: số yêu cầu/giây tăng 1,76 lần, độ trễ trung bình giảm còn 0,57 lần, kích thước phản hồi trung bình giảm còn 0,52 lần, bộ nhớ giảm còn 0,92 lần
Tier 2: Mô-đun Rust Wasm
- Biên dịch hàm Rust thành mô-đun Wasm rồi tải và chạy bằng runtime Wasm trên máy chủ host
- Máy chủ Node.js sử dụng
wasm-bindgen
- Hiệu năng so với mức cơ sở: số yêu cầu/giây tăng 2,03 lần, độ trễ trung bình giảm còn 0,50 lần
- Giải thích cách tự viết binding Wasm thủ công (cho người dùng ngôn ngữ khác)
Tier 3: Hàm native Rust
- Viết hàm bằng Rust, biên dịch thành mã native, rồi tải và chạy trong runtime host
- Node.js sử dụng
napi-rs
- Hiệu năng so với mức cơ sở: số yêu cầu/giây tăng 3,75 lần, độ trễ trung bình giảm còn 0,26 lần
Tier 4: Viết lại bằng Rust
- Viết lại toàn bộ máy chủ host bằng Rust
- Trên thực tế, chỉ viết lại một phần của máy chủ host sẽ khả thi hơn
- Hiệu năng so với mức cơ sở: số yêu cầu/giây tăng 4,93 lần, độ trễ trung bình giảm còn 0,21 lần, bộ nhớ giảm còn 0,01 lần (dùng 13MB)
Kết luận
- Mọi chiến lược đều tốt, nhưng Tier 3 là hiệu quả nhất
- Nếu có thể dùng thư viện tạo binding dựng sẵn, thì việc viết hàm native bằng Rust sẽ dễ dàng và có tác động lớn đến hiệu năng
4 bình luận
Ồ........ Tôi làm đủ thứ việc kiểu như người làm tạp vụ nên dần dần cũng dùng cả hai một chút, đây đúng là thông tin cực kỳ hữu ích.
Gần đây tôi đang tìm hiểu về Rust. Đây là một bài viết thú vị.
Bài này khá hay. Đây đúng là một ví dụ về việc sử dụng Rust cho đúng cách.
Có vẻ là Rust thực sự đang trở nên phổ biến trong những lĩnh vực mà trước đây người ta từng giải quyết bằng C/C++.