首页 > 解决方案 > 当AWS中并发api调用超过10000时,Spring book 2 Hikari连接不可用

问题描述

我正在将 Spring Boot 2 用于 API,托管在 aws ecs fargate 上。数据库是 RDS 上的 postgress 10.6,具有 16 gb ram 和 4 cpu。

我的hikari配置如下:

spring.datasource.testWhileIdle = true
spring.datasource.validationQuery = SELECT 1
spring.datasource.hikari.maximum-pool-size=100
spring.datasource.hikari.minimum-idle=80
spring.datasource.hikari.connection-timeout=30000
spring.datasource.hikari.idle-timeout=500000
spring.datasource.hikari.max-lifetime=1800000

现在通常这工作得很好..但是当负载出现在服务器上时,比如说大约 5000 个并发 API 请求..(虽然也不是很大..),我的应用程序崩溃了。已为 hikari 启用调试日志。所以收到以下消息:

hikaripool-1 - pool stats (total=100 active=100 idle=0 waiting=100)

异常消息说连接不可用:

HikariPool-1 - Connection is not available, request timed out after 30000ms.
org.hibernate.exception.JDBCConnectionException: Unable to acquire JDBC

同时,当我看到 RDS postgress 性能洞察力时,最大查询执行时间 < 0.03 秒..并且 CPU 利用率也低于 50%。所以数据库服务器没有问题。

我只使用 entitymager 和 JPA .. 不通过手动打开连接来使用任何查询。因此关闭连接或连接泄漏可能不是问题。但启用泄漏检测后:

spring.datasource.hikari.leakDetectionThreshold=2000

在日志中收到警告说检测到明显的连接泄漏:当我检查指向此错误的方法时:那么它只是 JPA findById() 方法..

那么连接不可用和请求超时的根本原因应该是什么 10k api 请求.. 池大小为 100.. 为什么在活动连接达到 100 并且等待为 100 后它不释放任何连接?我的 ECS 应用程序服务器会自动重启并出现此错误,并且仅在 5-7 分钟后才能访问..

标签: spring-bootconnection-poolinghikaricp

解决方案


HikariCP建议您在测试minimumIdle时出现峰值需求时移除

为了获得最大性能和对尖峰需求的响应,我们建议不要设置此值,而是允许 HikariCP 充当固定大小的连接

如果你删除它。空闲超时也无关紧要

另请参阅为 PostgreSQL 配置 HikariCP


推荐阅读