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

Вернуться на верх