url: /posts/174450702d9e609a072a7d1aaa84750b/
title: 如何在FastAPI中巧妙实现延迟队列,让任务乖乖等待?
date: 2025-08-22T14:32:13+08:00
lastmod: 2025-08-22T14:32:13+08:00
author: cmdragon
summary:
消息队列是分布式系统中实现异步通信的核心组件,延迟队列则允许在指定时间后投递消息,适用于定时任务和失败重试等场景。FastAPI中推荐使用Redis或RabbitMQ作为消息中间件,结合Celery或arq实现延迟队列。Redis通过Sorted Set和arq实现全异步延迟队列,RabbitMQ则利用死信队列实现延迟投递。实际应用包括电商订单超时、会议提醒、重试机制和定时报告等。常见问题如422验证错误和连接拒绝错误,需检查数据格式和连接参数。
categories:
- fastapi
tags:
- 消息队列
- 延迟队列
- FastAPI
- Redis
- RabbitMQ
- 异步通信
- 任务调度

扫描二维码)关注或者微信搜一搜:编程智域 前端至全栈交流与成长
发现1000+提升效率与开发的AI工具和实用程序:https://tools.cmdragon.cn/
1.1 消息队列基础与延迟队列概念
消息队列是分布式系统中实现异步通信的核心组件,允许系统解耦、提高吞吐量和可靠性。延迟队列是一种特殊消息队列,可在指定延迟时间后才投递消息,常见于定时任务、失败重试等场景(如订单超时取消)。
延时队列实现原理:
生产者 -> [消息队列] -- 延迟时间 --> 消费者
↓ 内部排序/时间轮调度
1.2 FastAPI集成消息队列的方案
在FastAPI中实现延迟队列推荐架构:
推荐工具链组合:
- 消息中间件:Redis Streams(轻量级)或 RabbitMQ(企业级)
- 任务调度:Celery 或 arq
- 延时机制:Redis Sorted Set 或 RabbitMQ死信队列
1.3 Redis延迟队列实现方案
以下使用Redis + arq实现全异步延迟队列:
环境配置
pip install fastapi==0.109.0 arq==0.26.0 pydantic==2.5.3 redis==5.0.0
项目结构
├── main.py # FastAPI入口
├── worker.py # ARQ worker
├── schemas.py # Pydantic数据模型
└── tasks.py # 延时任务定义
1.3.1 数据模型(schemas.py)
from pydantic import BaseModel
class OrderPayload(BaseModel):
order_id: str
expire_minutes: int = 30 # 默认30分钟后过期
class EmailPayload(BaseModel):
email: str
template: str = "welcome"
1.3.2 任务定义(tasks.py)
from arq import cron
from .schemas import OrderPayload, EmailPayload
async def process_order(ctx, payload: OrderPayload):
"""订单延迟处理任务"""
print(f"处理订单 {
payload.order_id},已等待 {
payload.expire_minutes} 分钟")
async def send_email(ctx, payload: EmailPayload):
"""延迟发送邮件"""
print(f"发送 {
payload.template} 邮件至 {
payload.email}"