Trong Rust, lập trình không đồng bộ dựa vào khái niệm về các đối tượng tương lai để biểu thị những hoạt động có thể kéo dài và có thể không hoàn tất ngay lập tức. Các đối tượng tương lai này cần một cơ chế để thúc đẩy quá trình thực thi và hoàn tất. Đây là lúc các trình thực thi không đồng bộ phát huy tác dụng.
Trình thực thi không đồng bộ chịu trách nhiệm quản lý và chạy các đối tượng tương lai này. Nền tảng này cung cấp một môi trường mà trong đó các thao tác trong tương lai có thể được lên lịch, thăm dò tiến trình và cuối cùng là hoàn tất. Hãy coi nó như một trình điều phối xử lý sự phức tạp của các tác vụ không đồng bộ, cho phép mã của bạn duy trì khả năng phản hồi và hiệu quả.
Rust cung cấp nhiều trình thực thi không đồng bộ, mỗi trình thực thi có những điểm mạnh và đặc điểm riêng.
Trình thực thi không đồng bộ
Lựa chọn về trình thực thi cho dịch vụ Rust phụ thuộc nhiều vào bản chất của khối lượng công việc. Mặc dù Tokio là một thời gian chạy không đồng bộ mạnh mẽ, nhưng có thể đây không phải là giải pháp tối ưu cho mọi trường hợp.
Đối với các dịch vụ chủ yếu thực thi các thao tác tuần tự, việc giới thiệu một thời gian chạy không đồng bộ như Tokio có thể làm tăng chi phí không cần thiết mà không mang lại hiệu suất đáng kể. Trong những trường hợp như vậy, một trình thực thi đơn luồng có thể là lựa chọn phù hợp và gọn nhẹ hơn. Phương pháp này giúp đơn giản hoá cơ sở mã và giảm mức tiêu thụ tài nguyên.
Định cấu hình luồng worker
Khi xử lý các dịch vụ vốn có các hoạt động đồng thời hoặc không đồng bộ, việc tận dụng các chức năng của một thời gian chạy không đồng bộ như Tokio trở nên rất quan trọng. Để tối đa hoá hiệu suất trong những trường hợp này, hãy định cấu hình thời gian chạy để sử dụng một số luồng worker khớp với số lượng lõi CPU có trên hệ thống. Điều này cho phép thời gian chạy phân phối hiệu quả khối lượng công việc và khai thác tối đa sức mạnh xử lý hiện có.
Hãy cân nhắc môi trường hệ thống tổng thể khi định cấu hình các luồng worker. Nếu nhiều dịch vụ đang chạy trên cùng một máy ảo, hãy điều chỉnh số lượng luồng worker cho mỗi dịch vụ để ngăn tình trạng sử dụng quá nhiều CPU và đảm bảo phân bổ tài nguyên một cách công bằng giữa tất cả các quy trình đang hoạt động.
Chặn các thao tác
Điều quan trọng là phải đảm bảo rằng các luồng worker trong thời gian chạy không đồng bộ không bao giờ bị chặn bởi các thao tác đồng bộ hoặc diễn ra trong thời gian dài. Việc chặn một luồng worker có thể cản trở nghiêm trọng khả năng xử lý các tác vụ đến và duy trì khả năng phản hồi của thời gian chạy.
Nếu một hàm thực thi trên một luồng worker cần thực hiện một thao tác chặn, hãy sử dụng tokio::spawn_blocking. Hàm này sẽ giảm tải thao tác chặn sang một nhóm luồng riêng biệt được thiết kế riêng cho các tác vụ như vậy, ngăn chặn mọi gián đoạn đối với các luồng worker không đồng bộ và đảm bảo khả năng phản hồi tổng thể của dịch vụ.