我将FastAPI用于一个几乎完全使用异步的生产应用程序,但在访问数据库时除外。数据库仍然依赖于同步SQLAlchemy,因为异步版本当时仍处于alpha (或早期beta版)中。
虽然我们的服务在访问数据库时确实会进行同步阻塞调用,但它仍然被封装在异步函数中。我们运行多个工作人员和几个应用实例,以确保我们不会遇到严重的瓶颈。
与线程并发
我理解FastAPI在使用def controller_method方法时使用线程提供并发性,但我似乎找不到它如何控制环境的任何细节。有人能帮我理解如何控制进程所能生成的最大线程吗?如果它达到了系统限制呢?
数据库连接
当我使用异步等待模型时,我在中间件中创建数据库连接对象,该对象被注入到控制器操作中。
@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连接池配置应该是这样的吗?
engine = sqlalchemy.create_engine(
cfg("DB_URL"),
pool_size=40,
max_overflow=20,
echo=False,
pool_use_lifo=False,
pool_recycle=120
)在这种情况下是否使用了一个中心线程池?是否有任何示例项目可供我查看,以了解如何在按比例部署时配置这些项目。
我曾使用Netflix作为参考,但如果有其他项目,我肯定会想看看这些。
https://stackoverflow.com/questions/73195338
复制相似问题