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

enter image description here

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

enter image description here

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

< Сильный > Путаница

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

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

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

1
Mr.DevEng 16 Апр 2020 в 10:43
Привет Джейкоб. Ваши вопросы все еще слишком болтливы. Пожалуйста, постарайтесь воздержаться от «заранее спасибо», «пожалуйста, помогите мне», «кто-нибудь может помочь» и других разговорных материалов. Это не чат, и здесь ожидается нейтральное техническое письмо.
 – 
halfer
17 Апр 2020 в 15:13
3
Судя по вашему описанию, у вас проблемы с архитектурой. Если каждая из ваших (разных) служб зависит от общей базы данных, то вы не используете микрослужбы и не получите преимуществ разделения микрослужб. Как правило, микросервисы должны управлять своими собственными хранилищами данных и обмениваться данными с помощью API или шин сообщений.
 – 
halfer
17 Апр 2020 в 15:19
Итак, что происходит с журналом 11-го проекта? В общем, я думаю, что эта проблема слишком широка, чтобы дать решение. Особенно с этой маленькой деталью, чтобы сузить проблему.
 – 
polve
18 Апр 2020 в 11:13

1 ответ

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

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

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

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

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

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

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

Разъяснение:

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

  2. Поддерживайте отдельный пул соединений 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

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

  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/

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

2
Anish B. 19 Апр 2020 в 16:38
Это объяснение подходит?
 – 
Anish B.
21 Апр 2020 в 11:37
1
Спасибо за ваше руководство. Я действительно работал над этим. Я нашел некоторые другие вещи, когда я устраняю неполадки. Я обновил свои выводы и последние обновления по updates части вопроса. Не могли бы вы посмотреть отредактированный вопрос?
 – 
Mr.DevEng
23 Апр 2020 в 20:56
Ага!! Я вижу.
 – 
Anish B.
23 Апр 2020 в 21:01
1
Только 1 раз я запускал свою службу безопасности. Он делает 10 соединений на уровне базы данных. Пожалуйста, проверьте обновленный снимок экрана также из запроса на стороне базы данных.
 – 
Mr.DevEng
23 Апр 2020 в 21:09
1
Да, я до сих пор использую, как то же самое. Но здесь я просто пытаюсь устранить неполадки, связанные с тем, что инициирование 10-го соединения является настройками по умолчанию механизма БД postgresql или нет. Если я запускаю 1 микросервис с этой БД безопасности, то я также не могу избежать этой ситуации. Потому что, даже если я начинаю 1 проект, он инициирует 10 соединений на уровне БД. Надеюсь, вы поняли, что я пытаюсь здесь объяснить.
 – 
Mr.DevEng
23 Апр 2020 в 21:16