Diesel nên được chạy bằng cách sử dụng một tác nhân đồng bộ hóa, actix_web :: web :: block hoặc Futures-cpupool?


10

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 đó.


Từ các ý kiến ​​trong vấn đề này , có vẻ như futures-cpupoollà giải pháp được đề xuất cho việc thiếu asynchỗ trợ trong Diesel.
Jmb

Đó là nhiều hơn một giải pháp chung. Tôi hy vọng cho một cái gì đó sẽ thúc đẩy hệ thống Actix. Dù sao đi nữa, tôi sẽ đào sâu vào tương lai-cpupool ngay bây giờ để tìm kiếm các vấn đề.
logina

Chào mừng bạn đến với Stack Overflow! Có vẻ như câu hỏi của bạn có thể được trả lời bằng các câu trả lời của Cách tiếp cận tốt nhất để đóng gói chặn I / O trong tương lai là gì? . Nếu không, vui lòng chỉnh sửa câu hỏi của bạn để giải thích sự khác biệt. Nếu không, chúng ta có thể đánh dấu câu hỏi này như đã trả lời.
Người quản lý

Vì cpupool cũng tương tác với nhóm kết nối chặn trong r2d2, tôi không chắc làm thế nào để giải quyết tốt nhất điều đó. Bây giờ tôi đang xem xét nó và sẽ sớm cập nhật với nó.
logina

Câu trả lời:


3

Tôi đang đi với tương lai-cpupool. Đó là giải pháp tốt nhất do tính chất ngăn chặn các tương tác của tôi.

Sử dụng actix_web :: web :: block là đủ, nhưng sẽ sử dụng nhóm luồng chung trong Actix (và do các cuộc gọi chặn tôi sử dụng, điều này có thể chặn toàn bộ nhóm luồng và can thiệp vào các tác vụ khác được đưa ra cho actix_web).

Tốt hơn là sử dụng Futures-cpupool để tạo một luồng riêng cho mỗi cơ sở dữ liệu chỉ cho các tương tác cơ sở dữ liệu. Bằng cách này, bạn nhóm tất cả các tác vụ cần chờ nhau (khi có nhiều tác vụ hơn kết nối) vào một nhóm, ngăn chúng chặn bất kỳ tác vụ nào khác không cần kết nối và có khả năng giới hạn số lượng luồng cho số lượng kết nối (để tác vụ sẽ chỉ được lên lịch khi nó sẽ không bị chặn).

Trong trường hợp bạn chỉ muốn sử dụng một kết nối cơ sở dữ liệu (hoặc rất ít), diễn viên đồng bộ hóa là một lựa chọn khá tốt. Nó sẽ hoạt động như một cpupool tương lai với một luồng, đảm bảo rằng tất cả các tác vụ được chạy cùng một lúc, ngoại trừ việc nó sẽ sử dụng một trong các luồng cơ bản của Actix-web chứ không phải một luồng riêng biệt (do đó, chỉ tốt cho rất ít kết nối) . Mặc dù vậy, tôi thấy cái nồi hơi quá lớn để có giá trị.


6
đọc những phát hiện của tôi ở trên - vui lòng đặt thông tin liên quan đến câu trả lời trong câu trả lời , không phải câu hỏi.
Người quản lý
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.