Scala 当前线程上是否存在Akka Ask阻塞

Scala 当前线程上是否存在Akka Ask阻塞,scala,akka,Scala,Akka,我有一个场景,在这个场景中,我必须通过用户id获取用户的详细信息。这是一个HTTP请求,在我的HTTP处理程序层中,我利用从请求中获得的id,向参与者发送一条消息,参与者然后与数据库服务对话以获取用户 既然这是一个HTTP请求,我需要通过发送一个响应来满足请求。因此,我考虑使用Akka ask模式,但我有以下问题: 这会阻止我当前的线程吗 在我的例子中,使用ask模式获取用户是一个可伸缩的解决方案吗?我的意思是,在任何给定的时间点,我都可以有几百到一百万的用户呼叫这个端点。使用ask模式获取用户

我有一个场景,在这个场景中,我必须通过用户id获取用户的详细信息。这是一个HTTP请求,在我的HTTP处理程序层中,我利用从请求中获得的id,向参与者发送一条消息,参与者然后与数据库服务对话以获取用户

既然这是一个HTTP请求,我需要通过发送一个响应来满足请求。因此,我考虑使用Akka ask模式,但我有以下问题:

  • 这会阻止我当前的线程吗

  • 在我的例子中,使用ask模式获取用户是一个可伸缩的解决方案吗?我的意思是,在任何给定的时间点,我都可以有几百到一百万的用户呼叫这个端点。使用ask模式获取用户是一个好主意吗

  • 在代码中,在我的HTTP控制器中是这样的

    val result: Future[Any] = userActor ? FetchUser(id)
    
    在我的演员中,我会做以下几点:

    case fetchUser: FetchUser => sender ! myService.getUser(fetchUser.id)
    

    按照您提出的顺序回答您的问题:

  • 否,使用
    不会阻止当前线程。它立即返回一个
    未来
    。然而,未来的结果可能无法立即获得
  • 如果您需要“可扩展”的解决方案,并且您的服务能够进行多个并发查询,那么您可能需要使用多个参与者,以便您可以同时提供多个
    ,或者请参阅下文,以了解一个仅限未来的可扩展解决方案
  • 独家期货

    如果您的参与者没有缓存任何中间值,那么您可以直接使用Futures并避免参与者的繁琐操作(例如Props、actorOf、receive、、…):

    现在,您可以随时调用
    ServicePool.queryService
    ,但一次最多只能调用
    maxquerys
    ,而且没有参与者:

    val alotOfIDs : Seq[ID] = (1 to 1000000) map { i => ID(i)}
    
    val results = alotOfIDs map ServicePool.queryService
    

    你如何回复你的回复?你在用未来的回应吗?在我的演员里,我只是做一个发送者!UserI假设流类似于,获取一个HTTP请求,使用ask模式返回一些结果,然后等待参与者的结果并给出响应。是这样吗?等待演员的结果是什么意思?在我的演员中,我做了以下事情:发送者!fetchUser(userId),其中dbService中的fetchUser(..)方法将返回未来的结果!好的,您正在使用的框架/应用程序服务器是否允许您在将来发送响应?是的,我有一个参与者池,因此我没有发现问题!
    val alotOfIDs : Seq[ID] = (1 to 1000000) map { i => ID(i)}
    
    val results = alotOfIDs map ServicePool.queryService