【发布时间】:2020-07-29 09:16:18
【问题描述】:
我正在使用 Spring MVC、Spring Boot 和 PostgreSQL 开发一个面向微服务的多租户应用程序。在我的服务域中,我有 30 个不同数量的 Spring Boot 项目连接到同一个数据库。
问题
当我并行启动超过 11 个 Spring Boot 项目时,我无法从数据库中检索数据。我只收到空白的 JSON 响应。但是如果我开始的项目少于 11 个,那么到那时,我就能得到微服务的结果。从第 12 次服务开始时出现问题。
疑难解答和我的调查
根据阅读,我做了如下一点点改动,
我设置了 PostgreSQL 配置文件,max_connections = 100 和 shared_buffers = 128MB。
但这并没有解决我的问题。并且还在我的application.property 中为hikari 连接池添加了额外的行,如下所示,
spring.datasource.hikari.minimumIdle=3
spring.datasource.hikari.maximum-pool-size=3
即使这样也不能解决我的问题。不过我一次最多只能启动 12 个 Spring Boot 项目。
在 pom.xml 上添加了以下内容,
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
<exclusions>
<exclusion>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-jdbc</artifactId>
<version>9.0.10</version>
</dependency>
application.property 更新如下,
spring.datasource.tomcat.initial-size=15
spring.datasource.tomcat.max-wait=20000
spring.datasource.tomcat.max-active=20
spring.datasource.tomcat.max-idle=20
spring.datasource.tomcat.min-idle=5
spring.datasource.tomcat.default-auto-commit=true
更新
如上所述,我总共有 100 个最大连接数。当我启动第一个微服务并通过查询(以下查询)监视数据库连接时,我得到了 10 个连接。
select max_conn,used,res_for_super,max_conn-used-res_for_super res_for_normal
from
(select count(*) used from pg_stat_activity) t1,
(select setting::int res_for_super from pg_settings where
name=$$superuser_reserved_connections$$) t2,
(select setting::int max_conn from pg_settings where
name=$$max_connections$$) t3
活动截图 - 当我只启动 1 个微服务时,我得到了这样的结果,
活动截图2:
因此,对于每个启动的微服务,后端数据库级别都会启动 10 个数据库连接。所以如果我启动超过 30 个微服务应用程序,它将去超过 300 个连接。
混乱
- 这是因为任何数据库默认设置吗?
- 还是因为连接数据库引擎时Tomcat出现问题?
即使我尝试在我的数据库节点中使用连接池工具pgbouncer。然后我也遇到了同样的问题。
如果这是由于数据库默认设置或配置造成的,我该如何覆盖它?
【问题讨论】:
-
嗨雅各布。你的问题还是太啰嗦了。请尽量避免使用“提前致谢”、“请帮助我”、“任何人都可以帮助”和其他对话材料。这不是聊天室,我们期望中立的技术性写作。
-
从您的描述看来,您遇到了架构问题。如果您的每个(不同)服务都依赖于一个公共数据库,那么您就不是在操作微服务,也不会获得微服务的分离优势。一般来说,微服务应该运行自己的数据存储并使用 API 或消息总线交换数据。
-
那么,第 11 个项目日志会发生什么?总的来说,我认为这个问题过于笼统,无法给出解决方案。尤其是这个小细节可以缩小问题的范围。
标签: spring postgresql spring-boot