如何在FastAPI中巧妙实现延迟队列,让任务乖乖等待?


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
  • 异步通信
  • 任务调度

cmdragon_cn.png cmdragon_cn.png

扫描二维码)关注或者微信搜一搜:编程智域 前端至全栈交流与成长

发现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}"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值