【问题标题】:When will Akka bring better performance?Akka 什么时候会带来更好的性能?
【发布时间】:2013-09-27 05:09:41
【问题描述】:

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

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

这个逻辑在akka中的实现非常简单,就几十行代码。然而,当使用 BoneCP Multithread Test 来测试性能时(即调用者 close 在满足 getConnection 返回的 Future[Connection] 时立即连接。基准 traversed 所有 close 请求和 Await对于结果Future),我发现 Akka 版本比许多其他连接池实现慢,例如 tomcat-jdbc、BoneCP 甚至 commons DBCP。

我尝试过的调整:

  1. 将池actor分成多个,每个都包含所有真实连接的一部分
  2. 调整一些默认调度程序配置参数(吞吐量、并行度)

但没有明显改善。

我的问题是:

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

【问题讨论】:

  • 我并不感到非常惊讶。不要怀疑你的开发技能,但是这些其他库有更多的开发时间来解决这个非常具体的问题
  • 希望看到#3 点的答案!
  • 我认为#3在这里很好地涵盖了:stackoverflow.com/questions/4493001/good-use-case-for-akka
  • 当所有连接都消失时,基准的表现如何?驱动程序锁定了吗?
  • 我会在您的代码中搜索一些阻塞行为。如果只是几十行,也许你可以在这里粘贴?

标签: performance scala akka


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 欢迎来到 stackoverflow!这不提供问题的答案。要批评或要求作者澄清,请在他们的帖子下方发表评论 - 您可以随时对自己的帖子发表评论,一旦您拥有足够的声誉,您就可以对任何帖子发表评论。请阅读指南以获得好的答案:stackoverflow.com/questions/how-to-answer.
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-01-16
      • 1970-01-01
      • 1970-01-01
      • 2011-09-27
      • 1970-01-01
      • 1970-01-01
      • 2011-12-14
      相关资源
      最近更新 更多