Вопрос или проблема
У меня есть приложение на Java Spring Boot, работающее на AWS EKS (Dockerized OS: ALPINE 3.14). У меня гибридная облачная архитектура, где моя база данных находится на месте.
Каждый раз, когда я делаю API-запрос, в начале я сталкиваюсь с задержкой в 25 секунд для получения пула соединений. Когда я держу свое приложение на месте, я не испытываю никаких задержек.
2024-08-06 09:40:19.716 DEBUG 1 --- [nio-9013-exec-6] o.apache.coyote.http11.Http11Processor : Сокет: [org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper@2d53393c:org.apache.tomcat.util.net.NioChannel@36787f9c:java.nio.channels.SocketChannel[connected local=orderservice-deployment-784cc9d757-ncrvp/10.xx.xx.xx:xxxx remote=/10.xx.xx.xx:xxxx]], Статус в: [OPEN_READ], Состояние выход: [CLOSED]
2024-08-06 09:40:19.716 DEBUG 1 --- [nio-9013-exec-6] o.apache.tomcat.util.threads.LimitLatch : Уменьшение [http-nio-9013-exec-6] latch=2
2024-08-06 09:40:19.716 DEBUG 1 --- [nio-9013-exec-6] org.apache.tomcat.util.net.NioEndpoint : Закрытие [org.apache.tomcat.util.net.NioEndpoint@2763c145].closeSocket([org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper@2d53393c:org.apache.tomcat.util.net.NioChannel@36787f9c:java.nio.channels.SocketChannel[connected local=orderservice-deployment-784cc9d757-ncrvp/10.xx.xx.xx:xxxx remote=/10.xx.xx.xx:xxxx]])
2024-08-06 09:40:20.654 DEBUG 1 --- [13-ClientPoller] org.apache.tomcat.util.net.NioEndpoint : время ожидания завершено: обработано ключей=1; сейчас=1722937220654; следующаяExpiration=1722937219753; количество ключей=0; событий нет=false; eval=false
2024-08-06 09:40:21.520 DEBUG 1 --- [nio-9013-exec-3] c.t.d.s.OracleDbConnector : время, потраченное на получение пула соединений :: 25012
2024-08-06 09:40:21.520 DEBUG 1 --- [nio-9013-exec-3] c.t.d.s.OracleDbConnector : SQL-запрос для выполнения :: select u.um_user_id,e.em_controller_id,e.xxxxx from user_master where u.um_em_entity_id=e.em_entity_id and e.em_entity_id='xxxx'
2024-08-06 09:40:21.526 DEBUG 1 --- [nio-9013-exec-3] c.t.d.s.OracleDbConnector : время, потраченное на выполнение запроса :: 6
2024-08-06 09:40:21.526 DEBUG 1 --- [nio-9013-exec-3] DbConnectorLogging : ИНТЕРАКТИВНЫЙ::
2024-08-06 09:40:21.526 DEBUG 1 --- [nio-9013-exec-3] DbConnectorLogging : ИНТЕРАКТИВНЫЙ::
2024-08-06 09:40:21.526 DEBUG 1 --- [nio-9013-exec-3] DbConnectorLogging : ИНТЕРАКТИВНЫЙ::
2024-08-06 09:40:21.526 DEBUG 1 --- [nio-9013-exec-3] DbConnectorLogging : ИНТЕРАКТИВНЫЙ::
2024-08-06 09:40:21.526 DEBUG 1 --- [nio-9013-exec-3] DbConnectorLogging : ИНТЕРАКТИВНЫЙ::
2024-08-06 09:40:21.526 DEBUG 1 --- [nio-9013-exec-3] DbConnectorLogging : ИНТЕРАКТИВНЫЙ::
2024-08-06 09:40:21.526 INFO 1 --- [nio-9013-exec-3] c.t.s.o.service.OrderProcessServiceImpl : детали сущности ::{controllerId=, userIdOrLogPktId=, custodianId=} lzi8bkzr-55vkrk5i2xk_6051288
Конфигурация Spring Boot
spring.datasource.hikari.auto-commit=true
spring.datasource.hikari.connection-timeout=800000
spring.datasource.hikari.idle-timeout=800000
spring.datasource.hikari.max-lifetime=1200000
spring.datasource.hikari.maximum-pool-size=30
spring.datasource.hikari.minimum-idle=15
Когда я переместил свое приложение на место, я не столкнулся с задержками, приложение работало очень плавно, я даже пытался запустить JAVA-приложение без EKS, но оно также терпело неудачу с той же задержкой.
Ответ или решение
Проблема задержки при получении пула соединений для вашего Java Spring Boot приложения на AWS EKS может быть связана с несколькими факторами, включая сетевые задержки при доступе к вашему базу данных, находящемуся в локальной сети, неправильную конфигурацию пула соединений, а также возможные ограничения по сетевым ресурсам.
Возможные причины и решения:
-
Сетевые задержки:
- Поскольку ваша база данных находится в локальной сети, а приложение работает в облаке, необходимо убедиться, что между AWS EKS и вашим локальным дата-центром настроено надежное соединение. Используйте VPN или AWS Direct Connect для снижения задержек. Также проводите тесты подключений (ping, traceroute) для анализа времени простоя и возможных узких мест в сети.
-
Конфигурация пула соединений:
- Убедитесь, что настройки пула соединений (
HikariCP
) оптимальны для ваших потребностей.- Параметры
maximum-pool-size
иminimum-idle
должны соответствовать ожидаемому количеству параллельных соединений. - Попробуйте уменьшить значение
connection-timeout
, чтобы быстрее выявлять проблемы с соединениями. - Проверьте, не блокируются ли соединения на уровне базы данных, и увеличьте значение
idle-timeout
, если приложение ожидает восстановления соединений по мере необходимости.
- Параметры
- Убедитесь, что настройки пула соединений (
-
Проблемы на уровне JDBC-драйвера:
- Убедитесь, что вы используете последнюю стабильную версию JDBC-драйвера для вашей базы данных. Обновления могут содержать исправления, которые снизят задержку при инциализации соединений.
-
Настройки базы данных:
- Проверьте параметры вашего сервера базы данных. Возможно, они также требуют оптимизации для удаленных соединений, таких как увеличение максимального количества соединений или улучшение конфигурации сети.
-
Мониторинг и диагностика:
- Используйте инструменты мониторинга (например, AWS CloudWatch или локальные инструменты мониторинга) для отслеживания производительности вашего приложения и базы данных. Обратите внимание на массовые задержки, время отклика и состояние соединений.
Рекомендации:
- Запустите ваши API тесты с использованием инструмента нагрузочного тестирования для оценки времени отклика в разных условиях нагрузки.
- Проведите профилирование приложения, чтобы выявить потенциальные узкие места, которые могут влиять на время ответа.
- Рассмотрите возможность кэширования данных, чтобы уменьшить количество обращений к базе данных.
Заключение
Проблема задержки при получении соединений в контексте облачной архитектуры часто коренится в сетевых настройках и конфигурации подключения к базе данных. Проведение полного анализа этих компонентов и оптимизация параметров может существенно снизить время ответа и улучшить производительность вашего приложения.