如何让FastAPI与消息队列的联姻既甜蜜又可靠?


url: /posts/1bebb53f4d9d6fbd0ecbba97562c07b0/
title: 如何让FastAPI与消息队列的联姻既甜蜜又可靠?
date: 2025-08-23T05:07:15+08:00
lastmod: 2025-08-23T05:07:15+08:00
author: cmdragon

summary:
消息队列与FastAPI集成在分布式系统中用于解耦服务,通过异步特性支持消息事务和幂等性保障。消息事务确保数据库操作与消息发送的原子性,避免数据不一致。幂等性设计通过唯一ID和Redis校验防止消息重复处理。关键解决方案包括事务型消息、幂等令牌和全局唯一ID。常见报错如422和503,可通过校验模型、重试机制和连接池解决。依赖库包括FastAPI、SQLAlchemy、Redis和Pika。

categories:

  • fastapi

tags:

  • 消息队列
  • FastAPI
  • 事务保障
  • 幂等性
  • RabbitMQ
  • 分布式系统
  • 数据一致性

cmdragon_cn.png cmdragon_cn.png

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

发现1000+提升效率与开发的AI工具和实用程序:https://tools.cmdragon.cn/

一、消息队列与FastAPI集成概述

在分布式系统中,消息队列(如RabbitMQ、Kafka)常用于解耦服务。FastAPI通过异步特性(async/await)完美支持消息队列的集成。


二、消息事务保障

2.1 问题场景

当业务逻辑需同时操作数据库和发送消息时(例如订单支付成功后更新库存并通知物流),若两者之一失败,会导致数据不一致:

  • 数据库更新成功但消息发送失败 → 其他服务未感知状态变更
  • 消息发送成功但数据库更新失败 → 其他服务收到无效消息
2.2 解决方案:事务型消息

核心思想:将消息发送纳入数据库事务。以下使用SQLAlchemy+pika(RabbitMQ客户端)实现:

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
import pika

# 初始化数据库和MQ连接
DATABASE_URL = "postgresql://user:pass@localhost/db"
RABBITMQ_URL = "amqp://guest:guest@localhost/"

engine = create_engine(DATABASE_URL)
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
mq_connection = pika.BlockingConnection(pika.URLParameters(RABBITMQ_URL))
channel = mq_connection.channel()

# 定义事务函数
def execute_transaction(order_id: int):
    db = SessionLocal()
    try:
        # Step 1: 数据库操作
        db.execute("UPDATE orders SET status='paid' WHERE id=:id", {
   
   "id": order_id})
        
        # Step 2: 发送消息(临时存储到DB事务中)
        channel.basic_publish(
            exchange="orders",
            routing_key="payment.success",
            body=f"Order {
     
     order_id} paid"
        )
        
        # Step 3: 提交事务(包括消息发送)
        db.commit()
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值