我有一个场景,我必须通过他的id获取用户的详细信息。这是一个HTTP请求进入我的HTTP处理程序层,我利用从请求中获取的id,向actor发送消息,然后与数据库服务进行对话以获取用户。
既然这是一个HTTP请求,我需要通过发回一个响应来满足请求。所以我想到了使用Akka问题模式,但我有以下问题:
这是否会阻止我当前的线程?
在这里使用ask模式为我的用户提取可扩展的解决方案吗?我的意思是,我可以让几百到一百万用户在任何给定的时间点呼叫这个终点。使用ask模式获取用户是一个好主意吗?
在代码中,它在我的HTTP控制器中看起来像这样
val result: Future[Any] = userActor ? FetchUser(id)
在我的演员中,我会做以下事情:
case fetchUser: FetchUser => sender ! myService.getUser(fetchUser.id)
答案 0 :(得分:1)
按照您提出的相同顺序回答您的问题:
?
不会阻止当前线程。它会立即返回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
以上的服务,而且没有Actors:
maxQueries