排队论在灵活工具动态连接池规模确定中的应用


vladmihalcea我很高兴又有一篇有趣的博文Vlad Mihalcea在。。。上jOOQ blog,这次是关于他的开源库FlexyPoolRead his previous jOOQ Tuesdays post on Hibernate here

弗拉德是Hibernate开发者的拥护者,也是这本畅销书的作者High-Performance Java Persistence,他对连接池略知一二。

介绍

早在2014年,我是一名软件架构师,我们的团队正在构建一个由多个节点组成的房地产平台,如下图所示:

databaseintegrationpoint

这是一个经典的企业架构布局。复制数据库是为了在节点出现故障时提供更好的吞吐量和可用性。有前端节点提供网站内容。还有许多后端节点,如电子邮件调度程序或数据导入批处理程序。

所有这些节点都需要数据库连接,对于读写事务,需要连接到主节点,对于只读事务,需要连接到从节点。

因为acquiring database connections is an expensive process,每个系统节点都使用自己的连接池。通过重用物理数据库连接,连接获取非常快,因此减少了整体事务响应时间。

连接池不仅可以减少事务响应时间,还可以消除流量峰值。如果没有连接池,在流量高峰期间,前端节点可能会获取所有数据库连接,从而使后端处理器无法连接数据库。

连接池拥有最大数量的数据库连接,允许连接在流量高峰发生时排队。因此,在流量高峰期间,由于排队机制,事务响应时间将会增加,但这比关闭整个系统好得多。

出于这两个原因,连接池在许多企业系统中是一个非常好的选择。

基于底层硬件资源,关系数据库只能提供有限数量的连接。因此,在为每个特定系统节点选择池大小时,我们必须非常小心。

连接池大小

我是幸运的负责计算我们应该为房地产平台中的每个系统节点分配多少连接的人。自从我从电子与电信专业毕业后,我记得当我们不得不提供电信网络时,我们了解到了一个类似的问题。Agner Krarup Erlang我发明了排队论来解决这个问题,我很好奇我们是否能通过应用Erlang找到合适的池大小queuing models

我不是唯一一个试图将排队论原理应用于软件系统的人。Percona有一个非常有趣的研究:预测MySQL的可伸缩性,在一个受无数变量影响的系统中的实际服务时间。

最后,我意识到解决这个问题的最好方法是不断地测量和调整。为此,我需要一个工具来捕获数据库连接度量,以及一种在企业系统运行时调整给定连接池的方法。

就这样FlexyPool出生了。

基本上,灵活工具是一个DataSource代理站在真正的JDBC前面DataSource或者其他代理(例如,语句日志记录)。

datasourceproxyarchitecture

灵活工具支持多种独立的连接池:

它收集以下指标:

  • 并发连接直方图
  • 并发连接请求直方图
  • 数据源连接获取时间直方图
  • 连接租用时间直方图
  • 最大池大小直方图
  • 总连接获取时间直方图
  • 溢出池大小直方图
  • 重试次数直方图

例如,并发连接计数度量让您了解在给定的流量负载下,某个应用程序需要多少个连接:

concurrentconnectioncount

连接获取度量告诉您从池中获取数据库连接需要多长时间:

connectionacquire

连接租用时间允许您发现长时间运行的事务,这在高性能OLTP应用程序中是不可取的:

connectionlease

对于独立连接池,灵活池可以将池的大小增加到最大容量之外,因为它提供了一个溢出缓冲区。这种溢出缓冲区的好处是,只有当传入流量导致某个连接获取超时时,它才允许您增加池的大小。

虽然FlexyPool也可以监控Java EE连接池,但它不能增加Java EE环境中的池大小,因为DataSource是应用程序服务器管理的资源。

结论

因为企业系统在发展,所以底层的数据访问模式也在发展。因此,监控底层数据库连接使用情况是一项非常重要的指标,需要定期监控。FlexyPool建立在CodaHale之上Dropwizard Metrics,因此您可以轻松地将其与众所周知的应用程序性能监控工具集成,例如Graphite或者Grafana

FlexyPool是开源的,它使用的是Apache许可证。您可以在项目存储库中找到它GitHub,并且所有发布的依赖项都可以在Maven Central上获得,所以很容易将其集成到您自己的项目中。

FkexyPool为许多企业系统提供动力,例如Etuovi,Mitch&Mates,和ScentBird。如果您决定在您当前的企业系统中使用它,并且您愿意提供一份证明,您可以赢得一份免费的myHigh-Performance Java Persistence书。