首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在线程模式下使用FastAPI时,如何避免数据库连接池的耗尽(使用“def`”而不是“异步防御”)

在线程模式下使用FastAPI时,如何避免数据库连接池的耗尽(使用“def`”而不是“异步防御”)
EN

Stack Overflow用户
提问于 2022-08-01 14:34:53
回答 1查看 654关注 0票数 4

我将FastAPI用于一个几乎完全使用异步的生产应用程序,但在访问数据库时除外。数据库仍然依赖于同步SQLAlchemy,因为异步版本当时仍处于alpha (或早期beta版)中。

虽然我们的服务在访问数据库时确实会进行同步阻塞调用,但它仍然被封装在异步函数中。我们运行多个工作人员和几个应用实例,以确保我们不会遇到严重的瓶颈。

与线程并发

我理解FastAPI在使用def controller_method方法时使用线程提供并发性,但我似乎找不到它如何控制环境的任何细节。有人能帮我理解如何控制进程所能生成的最大线程吗?如果它达到了系统限制呢?

数据库连接

当我使用异步等待模型时,我在中间件中创建数据库连接对象,该对象被注入到控制器操作中。

代码语言:javascript
复制
@app.middleware("http")
async def db_session_middleware(request: Request, call_next):
   
    await _set_request_id()

    try:
        request.state.db = get_sessionmaker(scope_func=None)
        response = await call_next(request)
    finally:
        if request.state.db.is_active:
            request.state.db.close()
    return response

当它通过线程完成时,控制器是否已经在一个单独的线程中被调用,从而确保每个请求都有一个单独的连接?

现在,如果我不能限制主进程产生的线程数量,如果我的应用程序得到了突然激增的请求,它会不会超过数据库连接池的限制并最终阻塞我的应用程序?

是否有我可以配置的FastAPI使用的中心线程池,或者这是由Uvicorn控制的?

乌维霍恩

我看到Uvicorn有一个配置,让我们使用--limit-concurrency 60标志限制并发性。这是否控制在线程模式下创建的并发线程的数量?

如果是这样,这是否总是低于我的连接池(连接池+ max_overflow=40)?

因此,在这个场景中,我允许uvicorn并发限制为60,我的db连接池配置应该是这样的吗?

代码语言:javascript
复制
engine = sqlalchemy.create_engine(
    cfg("DB_URL"), 
    pool_size=40, 
    max_overflow=20, 
    echo=False, 
    pool_use_lifo=False,
    pool_recycle=120
)

在这种情况下是否使用了一个中心线程池?是否有任何示例项目可供我查看,以了解如何在按比例部署时配置这些项目。

我曾使用Netflix作为参考,但如果有其他项目,我肯定会想看看这些。

EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73195338

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档