gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 12:26:22 24 4
gpt4 key购买 nike

我有一个场景,我必须通过他的 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/

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