异步任务是 Web 后端开发中最常见的需求,非常适合多任务、高并发的场景。本文分享如何使用 docker-compose、FastAPI、rq 来快速创建一个包含异步任务队列集群的 REST API,后端执行任务的节点可以随意扩展。
系统的架构图:
上图中的每一个方框都可以理解为一个服务器。
用户请求 api, api 将任务放入 redis 队列,worker 自动去 redis 队列取出任务并执行,worker 节点可以任意水平扩展。
接下来,我们来实现这一架构的 demo,你可以看到 docker 的强大和方便之处。
1、先创建一个虚拟环境,安装依赖
依赖 fastapi,redis,rq 库,安装后生成一个 requirements.txt 文件
mkdir myproject
python3 -m venv env
source env/bin/activate
pip install rq
pip install fastapi
pip install redis
pip freeze > requirements.txt
2、编码实现 REST API、Worker
REST 是一种风格,这里不是重点,我们使用 FastAPI 来快速创建一个接口,新建一个 api.py 的文件,内容如下:
from fastapi import FastAPI
from redis import Redis
from rq import Queue
from worker import send_captcha
app = FastAPI()
# 需要注意,这里的 host 是主机名,在 docker 中就是服务名,后面的 docker-compose.ymal 中的服务名称也要是这个
redis_conn = Redis(host='myproj_redis', port=6379, db=0)
# 定义一个队列,名称是 my_queue
q = Queue('my_queue', connection=redis_conn)
@app.get('/hello')
def hello():
"""Test endpoint"""
return {&