可扩展java web应用程序中的连接池



我只是好奇如何解决可伸缩java应用程序中的连接池问题。

想象一下,我有一个java web应用程序,设置了HikariCP(最大池大小为20),并且PosgtreSQL允许的最大连接数为100。

现在,我想为我的web应用程序实现可扩展性方法(无论如何),即使是自动缩放。所以我不知道最终会有多少web应用程序副本,它可能会动态变化(由于某些原因,例如集群工作负载)。

但问题是存在的。当我创建超过5个web应用程序副本时,会导致我的总连接数超过允许的最大连接数。

有没有解决这个问题的最佳实践(除了明显增加允许的最大连接数/减少池大小)?

感谢

您需要一个跨web应用程序的协调器。它将负责向外扩展,并将管理连接,以不超过100的限制。它将根据流量打开和关闭连接。

尽管如此,我的建议是考虑迁移到无SQL数据库,这对于可扩展性和性能来说是更合适的解决方案。

我首先要说的是,无论你做什么,只要你被限制在与数据库的100个连接范围内,它都不会扩展!

也就是说,你可以通过应用一些已知的技巧来优化和"挤出"性能。重要的是要了解权衡(可用性与一致性、延迟与吞吐量等):

  1. 缓存:如果您可以预测某些select查询,您可以离线计算它们(甚至可以从副本中计算?)并缓存结果。权衡:用户可能会得到不是最新的结果

  2. 缓冲/节流:所有更新/插入都进入一个队列,只有少数工作人员可以从队列中提取并更新数据库。权衡:你可以获得更多的可用性,但最终会变得"一致"(因为更新不会立即可见)。

  3. 您可能还必须以异步方式运行select,这意味着用户提交一个查询,当它准备好时,它将被"推"回客户端(或者客户端可以每隔几秒钟进行一次"轮询")。它也可以通过回调来实现。

通过将更新(写入)与读取分离,您将能够通过创建"只读"副本来获得更高的性能,这些副本可由Web服务器用于读取查询。

相关内容

最新更新