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为实际的项目或模块名。

注意

  1. 当使用FastAPI和Celery在Docker中部署时,确保每个服务(FastAPI、Celery worker、Celery beat和消息代理)都运行在其自己的容器中。
  2. 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的基本设置。此设置可用作起点,根据你的项目需求进行进一步的定制和优化。

posted on 2023-09-07 14:49  JentZhang  阅读(4271)  评论(0编辑  收藏  举报