将FastAPI服务器与芹菜工人服务器分开-目录结构



我在一台服务器上运行FastAPI应用程序,使用芹菜来完成繁重的工作。对FastAPI服务器的每个请求都会触发同一服务器上的一个任务,该任务可能会运行数小时。

因为,目前API代码和芹菜工作程序代码驻留并运行在同一台服务器上。我将API服务器启动为:

uvicorn app:app.main --port <PORT> --host <HOST>

和工人为:

celery -A app.worker worker --loglevel=info

当前目录结构大致如下,tasks/tasks.py中定义的任务由worker.py发现。API路由从tasks/tasks.py中引入特定的任务函数,并调用test_task.delay()

app/
models/
__init__.py
model1.py
model2.py
routers/
__init__.py
router1.py
router2.py
tasks/
__init__.py
tasks.py
main.py
worker.py

但是我预计在接下来的日子里会有很高的负荷。我期待着用一台服务器只处理API请求和多个高端服务器运行芹菜工人,连接到同一个代理实例扩展。

我希望API代码保持为一个单独的模块,工作器保持为一个单独的模块,以便它们可以单独部署,但任务可以从FastAPI应用程序调用。

然而,我不明白如何准确地构建我的项目文件,以一种我不需要在芹菜服务器上加载FastAPI代码的方式,反之亦然,但保持系统健壮,可扩展和生产就绪。

我是新手,所以如果这是一个新手问题,请原谅我。

我不太明白为什么芹菜任务需要从api类中导入,但是如果你想从api中删除对芹菜任务的依赖,你应该使用Celery.send_task函数,这样你就可以通过名称调用任务,而不是需要导入它们。

from celery import Celery
app = Celery(broker='some broker url', backend='some backend url')
app.send_task('task_name', kwargs={
'param1': 'value1',
'param2': 'value2',
})

最新更新