Djongo/PyMongo продолжает создавать новые соединения с БД для запросов API фреймворка Django REST
У меня возникла проблема с djongo
при использовании с Django REST framework, когда он инициирует новое соединение с моей MongoDB при каждом запросе, кроме самого первого после запуска веб-сервера. Это означает, что первый запрос к моему Django API выполняется быстро (~80 мс), но все последующие запросы выполняются значительно медленнее (~800 мс), поскольку все они инициируют новое соединение.
При профилировании запросов я вижу, что pymongo\pool.py:950(_create_connection)
и pymongo\pool.py:1263(connect)
присутствуют в каждом запросе, кроме первого, что, как я предполагаю, означает, что первый запрос использует предварительно инициированное соединение с БД, но все остальные должны создать новое соединение, отсюда и такая медлительность.
Я также вижу огромные всплески соединений в моей панели MongoDB, там должно быть только 1 соединение, но когда я тестирую это, оно внезапно увеличивается до 50+ соединений, и даже когда я выключаю веб-сервер, соединения уменьшаются только на одно, и остается множество зомби-соединений, которые умирают только после некоторого таймаута.
Вот результаты профилирования для первого и второго запросов.
Я не могу понять, это проблема с django
, djongo
, pymongo
или djangorestframework
.
Для установки и настройки я следовал инструкциям djongo на GitHub, так что все выглядит следующим образом:
DATABASES = {
"default": {
"ENGINE": "djongo",
"NAME": "django",
"CLIENT": {
"host": f"mongodb+srv://{MONGODB_PATH}",
}
}
}
(MONGODB_PATH = f"{MONGODB_DJANGO_USER}:{MONGODB_DJANGO_PASS}@{MONGODB_CLUSTER}"
из переменных окружения)
Конечная точка API, с которой я тестирую, выглядит следующим образом:
@api_view(["GET"])
@authentication_classes([TokenAuthentication])
@permission_classes([IsAuthenticated])
def test(request):
if request.method == "GET":
data = {"user": str(request.user)}
return JsonResponse(data)
Версии:
Django==3.2.7
djangorestframework==3.12.4
djongo==1.3.6
pymongo==3.12.0 (MongoDB 4.4.8 Enterprise)
P.S. Это намного быстрее, когда я запускаю веб-сервер ближе к БД, но я специально запускаю их далеко друг от друга для отладки, чтобы легче было заметить такие проблемы.