我有一个场景,我必须通过他的 id 获取用户的详细信息。这是一个进入我的 HTTP 处理程序层的 HTTP 请求,我利用从请求中获得的 id,向参与者发送一条消息,然后参与者与数据库服务对话以获取用户。
现在,由于这是一个 HTTP 请求,我需要通过发回响应来满足请求。所以我想到了使用 Akka ask 模式,但我有以下问题:
在代码中,它在我的 HTTP Controller 中看起来像这样
val result: Future[Any] = userActor ? FetchUser(id)
在我的 Actor 中,我会做以下事情:
case fetchUser: FetchUser => sender ! myService.getUser(fetchUser.id)
最佳答案
按照您提出的相同顺序回答您的问题:
?
不阻塞当前线程。它返回一个 Future
立即地。但是, Future 中的结果可能无法立即获得。 ?
一次,或参见下文,了解仅限 Futures 的可扩展解决方案。 future 独家
如果您的 Actors 没有缓存任何中间值,那么您可以直接使用 Futures 并避免 Actors 的繁琐(例如 Props、actorOf、receive、?、...):
import java.util.concurrent.Executors
import scala.concurrent.{ExecutionContext,Future}
object ServicePool {
private val myService = ???
val maxQueries = 11 //should come from a configuration file instead
private val queryExecutionPool =
ExecutionContext.fromExecutor(Executors.newFixedThreadPool(maxQueries))
type ID = ???
/**Will only hit the DB with maxQueries at once.*/
def queryService(id : ID) =
Future { myService getUser id }(queryExecutionPool)
}//end object ServiceQuery
您现在可以拨打
ServicePool.queryService
随心所欲,但服务不会受到超过 maxQueries
的影响在一次,没有 Actor :val alotOfIDs : Seq[ID] = (1 to 1000000) map { i => ID(i)}
val results = alotOfIDs map ServicePool.queryService
关于scala - Akka Ask 是否阻塞当前线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33623492/