Lý lịch
Tôi đang làm việc trên một ứng dụng web Actix sử dụng động cơ diesel thông qua r2d2 và không chắc chắn về cách thực hiện tốt nhất các truy vấn không đồng bộ. Tôi đã tìm thấy ba lựa chọn có vẻ hợp lý, nhưng không chắc cái nào là tốt nhất.
Các giải pháp tiềm năng
Đồng bộ hóa diễn viên
Đối với một người tôi có thể sử dụng ví dụ Actix , nhưng nó khá phức tạp và đòi hỏi một lượng lớn nồi hơi để xây dựng. Tôi hy vọng có một giải pháp hợp lý hơn.
Actix_web::web::block
Là một tùy chọn khác, tôi có thể sử dụng actix_web::web::block
để bọc các chức năng truy vấn của mình vào một tương lai, nhưng tôi không chắc về ý nghĩa hiệu suất của việc này.
Là truy vấn sau đó chạy trong cùng một hệ thống Tokio? Từ những gì tôi có thể tìm thấy trong nguồn, nó tạo ra một luồng trong luồng chủ đề Actix-web bên dưới . Đó có phải là vấn đề không?
Nếu tôi đọc đúng mã, r2d2 sẽ chặn luồng của nó khi có được kết nối, điều này sẽ chặn một phần của nhóm web Actix-core. Tương tự với các truy vấn cơ sở dữ liệu. Điều này sau đó sẽ chặn tất cả các trang web Actix nếu tôi thực hiện nhiều truy vấn hơn tôi có chủ đề trong nhóm đó? Nếu vậy, vấn đề lớn.
Tương lai-cpupool
Cuối cùng, đặt cược an toàn có thể có một số chi phí không cần thiết là tương lai-cpupool . Vấn đề chính là điều này có nghĩa là thêm một thùng khác vào dự án của tôi, mặc dù tôi không thích ý tưởng về nhiều cpu-pool trôi nổi trong ứng dụng của mình một cách không cần thiết.
Vì cả r2d2 và diesel sẽ chặn, có một số điều đáng ngạc nhiên ở đây.
Quan trọng nhất, không chia sẻ cpupool này với bất kỳ thứ gì không sử dụng cùng một nhóm r2d2 (vì tất cả các luồng được tạo có thể chỉ chặn chờ kết nối r2d2, khóa toàn bộ nhóm khi công việc tồn tại).
Thứ hai (rõ ràng hơn một chút), do đó bạn không nên có nhiều kết nối r2d2 hơn các luồng trong nhóm và ngược lại vì luồng lớn hơn sẽ lãng phí tài nguyên (các kết nối không được sử dụng / luồng liên tục bị chặn) (có thể thêm một luồng, vì có thể nhanh hơn kết nối bàn giao bởi bộ lập lịch hệ điều hành chứ không phải bộ lập lịch cpupool).
Cuối cùng, hãy nhớ cơ sở dữ liệu bạn đang sử dụng và hiệu suất bạn có ở đó. Chạy một kết nối r2d2 và một luồng duy nhất trong nhóm có thể là tốt nhất trong một ứng dụng sqlite ghi nặng (mặc dù tôi sẽ đề xuất một cơ sở dữ liệu thích hợp cho việc đó).
Câu trả lời cũ
Giải pháp cũ có thể hoạt động
https://www.reddit.com/r/rust/comments/ax0hp/potypes_to_scale_actixweb_and_d Diesel /
Về bản chất, khuyến nghị Futures-cpupool.
Cách tiếp cận tốt nhất để đóng gói chặn I / O trong tương lai là gì?
Đề xuất Futures-cpupool cho các trường hợp chung.
Giải pháp cũ không hiệu quả
https://www.reddit.com/r/rust/comments/9fe1ye/noob_here_can_we_talk_about_async_and_database/
Một sửa chữa thực sự tốt đẹp cho một phiên bản web Actix cũ. Từ những gì tôi có thể tìm thấy các yêu cầu không còn có một cpu-pool trong đó.
futures-cpupool
là giải pháp được đề xuất cho việc thiếuasync
hỗ trợ trong Diesel.