FastAPI如何集成celery实现定时任务和异步任务并且使用docker-compose部署
一、FastAPI和Celery结合实现定时任务和异步任务。
1. 安装所需的库
首先,确保你已安装fastapi
, celery
及其相关的库。例如,使用RabbitMQ作为消息代理,你可能需要:
pip install fastapi[all] celery[redis]
2. 设置Celery
在你的项目中,创建一个新的celery_app.py
:
from celery import Celery
celery_app = Celery(
"worker",
broker="redis://localhost:6379/0",
backend="redis://localhost:6379/0",
)
@celery_app.task
def long_task():
# Your long running task logic here
pass
3. 在FastAPI中使用Celery
在你的FastAPI应用中,你可以简单地导入Celery应用并调用任务:
from fastapi import FastAPI
from .celery_app import long_task
app = FastAPI()
@app.get("/")
def read_root():
task = long_task.delay() # This will run "long_task" in a Celery worker as soon as one is available
return {"message": "Task started!"}
4. 定时任务
要实现定时任务,你需要使用Celery的beat服务。首先,你需要为Celery
设置时间表。在celery_app.py
中添加:
from datetime import timedelta
celery_app.conf.beat_schedule = {
"call-task-every-minute": {
"task": "your_project_name.celery_app.long_task",
"schedule": timedelta(minutes=1),
}
}
然后,你可以启动Celery worker和beat服务来处理任务和定时任务:
celery -A your_project_name.celery_app worker --loglevel=info
celery -A your_project_name.celery_app beat --loglevel=info
替换your_project_name
为实际的项目或模块名。
注意
- 当使用FastAPI和Celery在Docker中部署时,确保每个服务(FastAPI、Celery worker、Celery beat和消息代理)都运行在其自己的容器中。
- Celery有很多配置选项,根据你的需要进行调整。
现在你已经成功地将FastAPI与Celery整合在一起,可以利用这种结合实现异步和定时任务了。
二、将FastAPI、Celery、定时任务以及Docker Compose整合
1. 创建项目结构
你可能需要如下的文件结构:
my_project/
│
├── app/
│ ├── main.py (your FastAPI app)
│ └── celery_app.py (your Celery setup)
│
├── docker-compose.yml
├── Dockerfile
└── requirements.txt
2. FastAPI和Celery配置
首先,确保你在requirements.txt
文件中列出了所有需要的依赖,包括fastapi
, celery[redis]
, uvicorn
等。
在celery_app.py
中设置你的Celery应用:
from celery import Celery
celery_app = Celery(
"worker",
broker="redis://redis:6379/0",
backend="redis://redis:6379/0",
)
@celery_app.task
def long_task():
# Your long running task logic here
pass
3. Dockerfile
在Dockerfile中,设置你的应用:
FROM python:3.8-slim
WORKDIR /app
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
COPY ./app /app
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
4. docker-compose.yml
这是你的docker-compose
配置,其中包含FastAPI应用、Celery worker、Celery beat和Redis:
version: '3.7'
services:
web:
build: .
command: uvicorn main:app --host 0.0.0.0 --port 8000 --reload
volumes:
- ./app:/app
ports:
- 8000:8000
depends_on:
- redis
worker:
build: .
command: celery -A celery_app worker --loglevel=info
volumes:
- ./app:/app
depends_on:
- redis
beat:
build: .
command: celery -A celery_app beat --loglevel=info
volumes:
- ./app:/app
depends_on:
- redis
redis:
image: "redis:alpine"
5. 启动
使用以下命令启动所有服务:
docker-compose up --build
注意事项
- 以上配置中,我们使用Redis作为消息代理。你可以根据需要选择其他的代理,比如RabbitMQ。
- 为了保持示例的简洁性,我们没有添加任何定时任务。你可以按照前面的说明在
celery_app.py
中加入beat schedule来定义你的定时任务。
现在你有了一个可以使用docker-compose
部署的FastAPI和Celery的基本设置。此设置可用作起点,根据你的项目需求进行进一步的定制和优化。
好记性不如烂笔头!