Проблема подключения из проектов Spring Boot к базе данных PostgreSQL при подключении - PullRequest
1 голос
/ 16 апреля 2020

Я работаю над мультитенантным приложением, ориентированным на микро сервисы, используя 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 за один раз.

На пом. 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 микросервис, я получаю вот так,

enter image description here

Скриншот активности 2:

enter image description here

Итак, здесь для каждого микро запуск службы, 10 подключений к базе данных инициируются на уровне внутренней базы данных. Поэтому, если я запускаю более 30 микросервисных приложений, оно будет go подключаться к более чем 300.

Путаница

  1. Это из-за какой-либо базы данных настройки по умолчанию?
  2. Или это из-за проблемы Tomcat при подключении к ядру БД?

Даже я пытался использовать инструмент пула соединений pgbouncer в моем узле базы данных. Кроме того, у меня возникают те же проблемы.

Если это связано с настройками или конфигурацией базы данных по умолчанию, как я могу это переопределить?

1 Ответ

1 голос
/ 19 апреля 2020

Микросервисная архитектура - это разновидность архитектуры, в которой приложение разбивается на несколько независимых сервисов, которые легко понять, разработать, протестировать и которые подвержены ошибкам.

Теперь согласно приведенному выше определению, каждая независимая служба должна иметь свои собственные отдельные независимые базы данных. Но эти службы могут взаимодействовать для данных, если это необходимо.

Каждый сервис должен иметь выбранные объекты в своей конкретной базе данных.

Если у вас есть общая база данных для всех этих независимых служб, то вы нарушаете правило архитектуры микросервисов.

В этом случае существует высокий риск избыточности данных.

Может быть, в вашем случае, случается, что службы содержат дублирующую версию данных и потенциально используют весь пул соединений.

Лучший подход - иметь отдельную базу данных (содержащую только сущности). укажите c только для этой службы) для отдельной независимой службы.

Уточнение:

  1. Объясните выше.

  2. Ведение отдельный пул соединений источника данных hikari для всех загрузочных модулей / проектов.

Например: Предположим, у вас есть два источника данных для двух модулей / проектов -

В application.properties .

## 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

Перейдите по этой ссылке, чтобы прочитать, как настроить:

  1. https://blogs.ashrithgn.com/multiple-data-source-in-spring-boot-using-spring-boot-data-starter/

  2. https://www.ru-rocker.com/2018/01/28/configure-multiple-data-source-spring-boot/

Или вам может потребоваться go для Hibernate Multi-tenancy с Hikari-CP.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...