Akka是否要求阻止当前线程

时间:2015-11-10 05:28:32

标签: scala akka

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

既然这是一个HTTP请求,我需要通过发回一个响应来满足请求。所以我想到了使用Akka问题模式,但我有以下问题:

  1. 这是否会阻止我当前的线程?

  2. 在这里使用ask模式为我的用户提取可扩展的解决方案吗?我的意思是,我可以让几百到一百万用户在任何给定的时间点呼叫这个终点。使用ask模式获取用户是一个好主意吗?

  3. 在代码中,它在我的HTTP控制器中看起来像这样

    val result: Future[Any] = userActor ? FetchUser(id)
    

    在我的演员中,我会做以下事情:

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

1 个答案:

答案 0 :(得分:1)

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

  1. 不,使用?不会阻止当前线程。它会立即返回Future。但是,未来的结果可能无法立即获得。
  2. 如果您需要解决方案是"可扩展",并且您的服务能够进行多个并发查询,那么您可能需要使用pool个Actors,以便为多个{{}提供服务1}},或者参见下面的仅限期货,可扩展的解决方案。
  3. 独家期货

    如果您的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以上的服务,而且没有Actors:

    maxQueries