gpt4 book ai didi

playframework-2.0 - 具有多个 Akka.futures 的多个 DB 访问 VS 在单个 Future 中包装 DB 访问

转载 作者:行者123 更新时间:2023-12-04 05:20:17 25 4
gpt4 key购买 nike

当我第一次使用 Play 2 进行开发时,我发现我在我的 Controller 中做了很多这样的事情(一个简单的例子):

 val promUser = Akka.future(UserService.findByUsername(access.username))
Async(
promUser.map {
_.map{
user => {
val promService = Akka.future(ServiceService loadOnlyWithUser (id,user.id.get))
Async(
promService.map { _.map { service =>
Ok(toJson(service))
}.getOrElse(BadRequest("not accessible"))}
)
}
}.getOrElse {
BadRequest("unauthorised")
}
}
)

有一个单一的 future 会更好吗?例如:
val promService = Akka.future{
val userOption = UserService.findByUsername(access.username)
userOption.map( user => {
ServiceService loadOnlyWithDeveloper (id,user.id.get)
}).getOrElse(None)

}
Async(
promService.map { _.map { service =>
Ok(toJson(service))
}.getOrElse(BadRequest("unauthorised"))}
)

一方面,我认为 Controller 的许多 future /返回可能会增加开销,另一方面,将调用分组到一个 future 将更具可读性,但会导致在 Akka 系统中运行的“线程”更大。对于更大的作业,我有一个额外的 Akka 系统,因此这些作业最多只能包含 4 个 SQL 事务。就我可以从 apache bench 上计算出来的而言,上面的例子之间没有任何区别......有什么我遗漏的吗?

最佳答案

与您的示例在性能上没有任何区别,因为它们是等效的。

当你写:

val promUser = Akka.future(UserService.findByUsername(access.username))

它没有开始评估 Future ,它仅在您映射它时才执行。

据我了解,您需要考虑 future 构成。这是我推荐的非常好的文档: http://docs.scala-lang.org/sips/pending/futures-promises.html

为了回答您的问题,如果您需要按顺序执行一堆查询,我认为如果您有多个 future ,每个数据库访问一个,那么我认为这没有区别。例如检索记录,然后将其删除。

您可以利用 Futures(除了使您的应用程序非阻塞)的地方是利用 for-comprehension 语法,以便您可以同时运行两个或多个异步 Futures,例如
for {
authUser <- User.findById(request.authUserId)
otherUser <- User.findById(id)
} yield (authUser, otherUser)

另外,我建议使用 flatMap将您的 future 组合在一起,而不是拥有多个 Async{}块。这样你就可以有效地压平你的多个 future , Future[Future[Result]]成单个 Future 可以是 AsyncResult .

关于playframework-2.0 - 具有多个 Akka.futures 的多个 DB 访问 VS 在单个 Future 中包装 DB 访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13760698/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com