Я работаю над многопользовательским приложением, ориентированным на микросервисы, с использованием 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
в моем узле базы данных. Тогда и я получаю те же проблемы.
Если это связано с настройками или конфигурацией базы данных по умолчанию, как я могу переопределить это?
1 ответ
Микросервисная архитектура — это разновидность архитектуры, в которой приложение разбито на несколько независимых сервисов, которые легко понять, разработать, протестировать и которые подвержены ошибкам.
Теперь, согласно приведенному выше определению, каждая независимая служба должна иметь свои собственные отдельные независимые базы данных. Но эти сервисы могут взаимодействовать для данных, если это необходимо.
Каждая служба должна иметь выбранные объекты в своей конкретной базе данных.
Если у вас есть общая база данных для всех этих независимых сервисов, то вы нарушаете правило микросервисной архитектуры.
В этом случае высок риск избыточности данных.
Возможно, в вашем случае службы содержат дублирующую версию данных и потенциально используют весь пул соединений.
Лучшим подходом является наличие отдельной базы данных (содержащей только объекты, относящиеся только к этой службе) для отдельной независимой службы.
Разъяснение:
Объясните выше.
Поддерживайте отдельный пул соединений hikari с источником данных для всех модулей/проектов весенней загрузки.
Например: предположим, у вас есть два источника данных для двух модулей/проектов -
В свойствах приложения.
## datasource for first service/module ##
datasource1.url=jdbc:postgresql://localhost:3306/service1
datasource1.username=service1
datasource1.password=password1
datasource1.driver-class-name=org.postgresql.Driver
datasource1.initial-size=15
datasource1.max-wait=20000
datasource1.max-active=20
datasource1.max-idle=20
datasource1.min-idle=5
datasource1.default-auto-commit=true
## datasource for second service/module ##
datasource2.url=jdbc:postgresql://localhost:3306/service2
datasource2.username=service2
datasource2.password=password2
datasource2.driver-class-name=org.postgresql.Driver
datasource2.initial-size=15
datasource2.max-wait=20000
datasource2.max-active=20
datasource2.max-idle=20
datasource2.min-idle=5
datasource2.default-auto-commit=true
Перейдите по этим ссылкам, чтобы прочитать, как настроить:
https://blogs .ashrithgn.com/multiple-data-source-in-spring-boot-using-spring-boot-data-starter/
https://www.ru -rocker.com/2018/01/28/configure-multiple-data-source-spring-boot/
Или вам может понадобиться перейти на Hibernate Multi-tenancy с Hikari-CP.
updates
части вопроса. Не могли бы вы посмотреть отредактированный вопрос?
Похожие вопросы
Новые вопросы
spring
Spring Framework - это среда с открытым исходным кодом для разработки приложений на платформе Java. В ее основе лежит широкая поддержка компонентно-ориентированных архитектур, и в настоящее время в ней имеется более двадцати высокоинтегрированных модулей.