akka / actor模型中的同步调用

时间:2011-11-04 21:58:37

标签: actor akka

我最近一直在研究Akka,它看起来像是一个在JVM上构建可扩展服务器的优秀框架。但是JVM上的大多数库都是阻塞的(例如JDBC),所以不要因为使用基于事件的模型而失去性能优势,因为你的线程总会被阻塞?阿卡是否有办法解决这个问题?或者,只有在JVM上获得更多非阻塞库之后,您才能忍受它?

2 个答案:

答案 0 :(得分:2)

了解CQRS,它通过将读取与写入分开来极大地提高了可伸缩性。这意味着您可以将读取与写入分开扩展。

答案 1 :(得分:0)

对于您提到的IO阻塞问题类型,Scala提供了一种完全匹配的语言嵌入式解决方案:Futures。例如:

def expensiveDBQuery(key : Key) = Future {
  //...query the database 
}

val dbResult : Future[Result] = 
  expensiveDBQuery(...) //non-blocking call

dbResult立即从函数调用返回。结果将在“Future”中提供。关于未来的一个很酷的部分是你可以像任何旧的集合一样思考它们,除非你永远不能在未来上调用.size。除此之外,所有收集功能(例如mapfilterforeach,...)都是合理的游戏。只需将dbResult视为结果列表即可。你会用这样的清单做什么:

dbResult.map(_.getValues)
        .filter(values => someTestOnValues(values))
        ...

该调用序列设置一个计算管道,只要从数据库实际返回Result,就会调用该管道。您可以在数据到达之前提供一系列计算步骤。所有都是异步的。