When will Akka bring better performance?
我刚刚用akka编写了一个JDBC连接池。
它使用一个参与者来保存实际数据库连接的"maxpoolsize"集合。调用者向池参与者请求连接,并接收一个Future[Connection],连接的状态变为"忙碌",直到调用者将其返回到connection.close上的池。如果所有连接都忙,则新的传入连接请求将放置在等待队列中(也由池参与者持有)。稍后,当返回连接时,将满足等待请求。
这个逻辑在Akka中的实现非常简单,只有几十行代码。但是,当使用bonecp多线程测试来测试性能时(即调用方close在满足getConnection返回的Future[Connection]时立即进行连接。基准的traversed所有close请求和Await对于结果Future,我发现akka版本比其他连接池实现(如tomcat jdbc、bonecp甚至commons dbcp)慢。
我尝试过的调优:
将池参与者拆分为多个池参与者,每个池参与者包含所有实际连接的一部分。
调整一些默认的调度器配置参数(吞吐量、并行性)
但没有明显的改善。
我的问题是:
这是否是使用AKKA将获得更好性能的合适用例?
如果是的话,我怎样才能得到与手工构建的线程连接池实现相似或更好的基准数据呢?
如果不是,为什么?是否有任何既定的标准可以帮助我决定何时使用AKKA?
- 我一点也不惊讶。一点也不怀疑你的开发技巧,但是这些其他的libs有更多的开发时间投入到它们中来解决这个非常具体的问题。
- 希望看到3分的答案!
- 我认为3在这里介绍得很好:stackoverflow.com/questions/4493001/good-use-case-for-akka
- 当所有连接都断开时,基准如何工作?驾驶员锁闭了吗?
- 我将在您的代码中搜索一些阻塞行为。如果只有几十行,也许你可以把它贴在这里?
要回答问题1,这不是AKKA在速度方面的优势所在。您基本上解决了一个问题,这个问题通常是通过为多个读写器优化的并发数据结构来解决的,并通过一个参与者将其序列化。
另一种方法是创建路由器,它将产生几个从属参与者,每个参与者代表一个连接。
但要注意,可能存在潜在的种族条件。
另外,您使用的是什么版本的scala和akka?
对于高度并行计算,AKKA可能是一个很好的选择,而JDBC连接池并不是高度并行计算的一个好例子。
- 欢迎来到StackOverflow!这并不能回答这个问题。要评论或要求作者澄清,请在他们的帖子下面留下评论-你可以随时对自己的帖子发表评论,一旦你有足够的声誉,你就可以对任何帖子发表评论。请阅读正确答案指南:stackoverflow.com/questions/how-to-answer。
- 不客气。