Время отклика увеличивается со временем работы приложения Spring-Boot?
Я новичок в разработке Backend. Поэтому, если я не правильно описал свою проблему или вы хотите больше информации по проблеме, пожалуйста, спрашивайте, я буду учиться.
У нас есть бэкенд в монолитной архитектуре Python-Django, который мы планируем перевести на микросервисы Spring-boot. Используемая нами база данных - Postgres.
Я начал с того, что переместил критические GET API в первую очередь из нашего существующего кода, т.е. POST и PATCH запросы обрабатываются приложением Django самостоятельно, но GET запросы обрабатываются Spring-Boot.
Итак, я перенаправил вызов API GET на Python-Django в микросервис Spring boot, используя Requests HTTP Library и добавил откат назад в код Python-Django, если requests.status_code не 200 от приложения Spring-Boot
Фрагмент кода перенаправления на языке Python:
SPRING_URL = SPRING_MICROSERVICE_URL + "/users/sent/{user_id}/"
response = requests.get(
url=SPRING_URL.format(user_id=self.request.user.id), params=payload
)
if response.status_code == 200:
return self.get_response(data=response.json())
else
fallback to the existing python-django code
Имеется 6-7 вызовов БД, из которых только 1 занимает время на Materialized View PSQL, который занимает около 1 сек для некоторых запросов на моей локальной и промежуточной машинах. Я использую HikariCP для пула соединений.
Теперь, когда я тестирую его на своей локальной машине и на машине staging, используя JMeter непосредственно на Spring-Application он показывает среднее время 90-100 мс с max-min 30 и 2500 мс соответственно, и около 110-140 мс с min-max 50-3000 мс соответственно через перенаправление django, что является приемлемым.
Свойства потока JMeter:
Number of threads (users) : 2
Ramp-up period (seconds) : 1
Loop Count : 1000
Теперь, когда я развертываю его на сервере Production (http запросы django перенаправляются на spring-boot), время ответа увеличивается со временем, которое я ожидал уменьшить или, по крайней мере, сравняться с django приложением.
Django приложение (без перенаправления) занимало около 200-220 мс на Production, но теперь оно увеличивается со временем с 31 мс до 10,000 мс и продолжает увеличиваться (поэтому мы вернулись к django приложению)
Одним из узких мест является запрос к psql-view, для которого я пытался увеличить размер пула соединений как со стороны приложения, так и со стороны БД, но это не помогло.
Я понятия не имею, почему он так плохо ведет себя в производстве, от которого я ожидал импровизации. Пожалуйста, посоветуйте что-нибудь.
Мои вопросы:
- Является ли хорошей практикой вызов приложения Spring-boot из приложения Django? Поскольку оба приложения обрабатывают несколько HTTP-запросов по-разному.
- Поскольку приложения Spring могут обрабатывать несколько запросов, используя несколько потоков, а django обслуживает один запрос за один раз, играет ли это какую-либо роль в замедлении работы? Помогает ли увеличение размера пула соединений в моем случае?
Некоторые конфиги :
Использование Gradle в качестве инструмента автоматизации сборки
Django - gunicorn.config - threads = 4