Как разделить соединение с базой данных между рабочими с помощью FastAPI + uvicorn?

Я пытаюсь создать приложение с помощью FastAPI + uvicorn.

Это приложение должно поддерживать одновременные подключения. Я не могу гарантировать, что весь код может быть выполнен в режиме async / await.

Затем я решил использовать параметры --workers X от uvicorn для обработки одновременных подключений, но мне нужно использовать одно и то же соединение с базой данных для всех рабочих.

Я пробовал следующий пример:

import time
from pymongo.database import Database
from fastapi import Depends, FastAPI
from dynaconf import settings
from pymongo import MongoClient

print("-------> Creating a new MongoDB connection")
db_conn = MongoClient(settings.MONGODB_URI)
db = db_conn.get_database('mydb')

app = FastAPI()

def get_db():
    return db

@app.get("/{id}")
async def main(id: str, db: Database = Depends(get_db)):
    print("Recebido id: " + id)
    time.sleep(10)
    return { 'id': id }
$uvicorn main:app --workers 2
INFO:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
INFO:     Started parent process [24730]
-------> Creating a new MongoDB connection
-------> Creating a new MongoDB connection
INFO:     Started server process [24733]
INFO:     Waiting for application startup.
INFO:     Application startup complete.
INFO:     Started server process [24732]
INFO:     Waiting for application startup.
INFO:     Application startup complete.

Но я получаю два соединения mongodb.

Как я могу поделиться соединением MongoDB и избежать создания соединения для каждого рабочего?


person Kleyson Rios    schedule 08.08.2020    source источник
comment
Привет @ kleyson-rios, ты когда-нибудь находил решение этой проблемы?   -  person Mabyn    schedule 15.12.2020
comment
@Mabyn Нет, не видел.   -  person Kleyson Rios    schedule 15.12.2020


Ответы (1)


Вы не должны делиться подключением, так как оно имеет состояние. Два или более процесса не могут успешно использовать одно сокетное соединение.

person AKX    schedule 08.08.2020
comment
но если мое приложение работает в облаке, и количество приложений растет автоматически в зависимости от спроса, максимальное количество подключений к MongoDB может быть заполнено и заблокировать создание новых экземпляров. Как бороться с этим сенарио? Есть ограничения на максимальное соединение mongodb, но нет ограничений в экземплярах приложения. - person Kleyson Rios; 08.08.2020
comment
Вам следует беспокоиться об этом только тогда, когда это действительно произойдет. - person AKX; 08.08.2020
comment
Это неверно, поскольку каждое соединение обрабатывает пул соединений ... это просто означает, что ВЫ ДОЛЖНЫ использовать только одно соединение для каждого приложения. - person Yuki; 20.04.2021
comment
@Yuki OP говорит, что мне нужно использовать одно и то же соединение с базой данных для всех рабочих и избегать создания соединения для каждого рабочего. В своем комментарии я имел в виду, что вы не можете использовать одно соединение с сокетом. - person AKX; 20.04.2021
comment
Согласовано. Не понял этого из контекста. - person Yuki; 21.04.2021