Akka何时会带来更好的表现?

时间:2013-09-22 03:37:48

标签: performance scala akka

我刚刚使用Akka编写了一个JDBC连接池。

它使用actor来保存真实数据库连接的“maxPoolSize”集合。调用者向池actor询问连接并收到Future[Connection]并且连接的状态变为“忙”,直到调用者将其返回到connection.close的池中。如果所有连接都忙,则新的传入连接请求将被置于等待队列(也由池actor保持)。稍后当返回连接时,将满足等待请求。

这种逻辑的实现在akka中非常容易,只需要几十行代码。但是,当使用BoneCP Multithread Test来测试性能时(即调用者closeFuture[Connection]返回getConnection时,会立即建立连接。基准traversed结果close的所有Await请求和Future),我发现Akka版本比许多其他连接池实现要慢,例如tomcat-jdbc,BoneCP甚至是公共DBCP。

我尝试过调整:

  1. 将池actor分成多个,每个都拥有所有真实连接的一部分
  2. 调整一些默认调度程序配置参数(吞吐量,并行性)
  3. 但没有看到明显的改善。

    我的问题是:

    1. 这是一个合适的用例,使用akka会获得更好的性能吗?
    2. 如果是,我怎样才能获得与那些手工制作的线程连接池实现类似或更好的基准数据?
    3. 如果不是,为什么?是否有任何既定标准可以帮助我决定何时使用akka

3 个答案:

答案 0 :(得分:2)

要回答问题#1,这不是Akka在速度方面表现优异的用例。您基本上已经解决了一个问题,该问题通常通过为多个读者和编写者优化的并发数据结构来解决,并通过单个actor进行序列化。

答案 1 :(得分:0)

另一种方法是创建Router,它将生成几个从属Actors,每个Actors代表一个连接。

但要注意可能存在潜在的竞争条件。

此外,您使用的是什么版本的Scala和Akka?

答案 2 :(得分:-1)

Akka可能是高度并行计算的不错选择,而JDBC连接池不是高度并行计算的好例子。