scala - Akka Ask 是否阻塞当前线程

标签 scala akka

我有一个场景,我必须通过他的 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 中的结果可能无法立即获得。
  • 如果您需要解决方案“可扩展”,并且您的服务能够进行多个并发查询,那么您可能需要使用 pool Actor ,以便您可以服务多个 ?一次,或参见下文,了解仅限 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/

    相关文章:

    scala - 如何拆分输入文件名并在 spark 数据框列中添加特定值

    scala - 在 Akka 中暂停 Actor

    scala - mapMaterializedValue 对 Source.actorRef 不执行任何操作

    scala - Akka流源-Cassandra结果集

    scala - Akka Streams 对一组键进行过滤和分组

    multithreading - 将 Akka Actor 固定/运行到主线程

    scala - 与方差混淆

    java - 如何将我们的自定义库添加到 Apache Spark?

    scala - com.typesafe.sbt#sbt-pgp 发生了什么?

    xml - 发布 DTD/XXE XML 时测试 Scala Play 行为