是否应该使用同步角色,actix_web :: web :: block或futures-cpupool运行柴油?


10

背景

我正在通过r2d2使用柴油的actix-web应用程序上工作,并且不确定如何最好地进行异步查询。我发现了三个看似合理的选择,但不确定哪个是最好的。

潜在解决方案

同步演员

对于我来说,我可以使用actix示例,但是它非常复杂,需要大量样板来构建。我希望有一个更合理的解决方案。

Actix_web::web::block

作为另一个选择,我可以使用将actix_web::web::block查询功能包装到将来,但是我不确定这样做的性能含义。

然后,该查询是否在同一Tokio系统中运行?从我在源代码中可以找到的地方,它在底层的actix-web线程池中创建了一个线程。那是问题吗?

如果我没看错代码,则r2d2在获取连接时会阻塞其线程,这会阻塞部分核心actix-web池。与数据库查询相同。如果我执行的查询多于该池中的线程数,这将阻止所有actix-web?如果是这样,那就大问题了。

期货

最终,可能会有一些不必要开销的安全选择是futures-cpupool。主要问题是,这意味着向我的项目中添加另一个板条箱,尽管我不喜欢不必要地在应用程序中浮动多个cpu池的想法。

由于r2d2和柴油都会阻塞,因此这里有令人惊讶的棘手事情。

最重要的是,不要与不使用同一r2d2池的任何事物共享此cpupool(因为创建的所有线程可能只是阻塞等待r2d2连接,在工作存在时锁定整个池)。

其次(更明显一点),因此您不应该拥有比池中线程更多的r2d2连接,反之亦然,因为更大的r2d2连接会浪费资源(连接未使用/线程不断被阻塞)(也许还有一个线程,也许更快)由OS调度程序而不是cpupool调度程序进行连接切换)。

最后,请注意您正在使用哪个数据库以及那里的性能。在写繁琐的sqlite应用程序中运行单个连接r2d2和池中的单个线程可能是最好的方法(尽管我会为此建议一个合适的数据库)。

旧答案

可能有效的旧解决方案

https://www.reddit.com/r/rust/comments/axy0hp/patterns_to_scale_actixweb_and_diesel/

本质上,建议使用Futures-cpupool。

在future-rs中封装阻塞I / O的最佳方法是什么?

对于一般情况,建议使用Futures-cpupool。

无效的旧解决方案

https://www.reddit.com/r/rust/comments/9fe1ye/noob_here_can_we_talk_about_async_and_databases/

对旧的actix-web版本的一个非常好的修复。从我可以找到的请求中,不再有CPU池。


本期的评论看来futures-cpupool,由于缺乏async柴油机的支持,建议的解决方法是。
JMB

那更多是一个通用的解决方案。我希望有一些可以利用actix系统的东西。尽管如此,我现在将深入研究future-cpupool来寻找问题。
logina

欢迎使用Stack Overflow!看起来您的问题可能由“ 在Future-rs中封装阻塞I / O的最佳方法什么?”的答案回答。如果不是,请编辑您的问题以解释差异。否则,我们可以将此问题标记为已回答。
Shepmaster

由于cpupool也与r2d2中的阻塞连接池进行交互,因此我不确定如何最好地解决该问题。我现在正在亲自调查,并将很快进行更新。
logina

Answers:


3

我要使用Futures-cpupool。由于我的互动受阻,这是最好的解决方案。

使用actix_web :: web :: block足够不错,但是将在actix中使用共享线程池(由于我使用了阻塞调用,这可能会阻塞整个线程池并干扰分配给actix_web的其他任务)。

最好使用futures-cpupool为每个数据库创建一个单独的线程池,仅用于数据库交互。通过这种方式,您可以将所有需要等待的所有任务(当任务多于连接)分组到一个池中,从而防止它们阻止不需要连接的任何其他任务,并有可能限制线程的数量。连接数(以便仅在不阻止任务时安排任务)。

在您只想使用一个数据库连接(或很少使用)的情况下,sync actor是一个不错的选择。它将像一个带有一个线程的futures-cpupool一样,确保所有任务一次运行一次,除了它将使用actix-web的基础线程之一而不是单独的线程(因此,仅适用于很少的连接) 。不过,我发现样板太大,不值得。


6
阅读以上我的发现 -请在答案中而不是问题中添加与答案相关的信息。
Shepmaster
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.