技术栈系统总结


一、FastAPI

是什么 Python 的现代 Web 框架,专门用来写后端接口(API)。相比老牌的 Flask,FastAPI 原生支持异步、自动生成文档、自带数据校验,是目前 Python 后端的主流选择。

核心概念

路由是 FastAPI 的基础,决定"哪个 URL 对应哪个函数"。用装饰器注册,@app.get("/users") 表示 GET 请求打到 /users 时执行这个函数,@app.post("/generate") 同理。

请求数据分两种:路径参数是 URL 里的一部分,比如 /users/{user_id} 里的 user_id;请求体是 POST 请求里携带的 JSON 数据,用 Pydantic 模型来接收。

Pydantic 是 FastAPI 的核心依赖,用 class 继承 BaseModel 来定义数据结构。FastAPI 会自动用它做参数校验,格式不对直接返回 422 错误,不需要你手动写校验逻辑。

异步是 FastAPI 的重要特性。用 async def 定义异步接口,配合 await 调用耗时操作(比如 AI API 调用、数据库查询),让服务在等待期间可以处理其他请求,不会因为一个慢请求卡死整个服务。

错误处理用 try/except 捕获异常,结合 HTTPException 返回规范的错误响应,包含状态码和错误信息。统一的错误格式让前端更容易处理异常情况。

CORS 中间件解决跨域问题。前端和后端不在同一个域名或端口时,浏览器会拦截请求,加上 CORS 中间件告诉浏览器"允许这个来源访问",前后端联调才能正常工作。

依赖注入(Depends)是 FastAPI 提供的一种机制,把公共逻辑(比如验证登录状态、获取数据库连接)抽出来复用,避免每个接口都重复写同样的代码。

/docs 是 FastAPI 自动生成的 Swagger 接口文档页面,可以直接在浏览器里测试所有接口,开发调试非常方便。

项目结构 成熟的 FastAPI 项目不会把所有代码写在一个文件里,通常按功能拆分:main.py 是入口,routers/ 存放各模块的路由,schemas/ 存放 Pydantic 数据模型,services/ 存放业务逻辑。这样代码清晰,也方便团队协作。

运行方式 用 uvicorn 启动,它是一个高性能的 ASGI 服务器,专门用来跑异步 Python Web 应用。命令是 uvicorn main:app --reload--reload 参数让代码改动后自动重启,开发时很方便。


二、Redis

是什么 一个运行在内存里的键值数据库。因为数据存在内存而不是硬盘,读写速度极快,通常比普通数据库快几十倍到上百倍。

核心用途:缓存 把耗时操作的结果暂存起来,下次同样的请求直接返回缓存结果,不重复计算。典型场景:同一个 prompt 的 AI 生成结果,第一次生成后存入 Redis,第二次同样的请求直接返回,既省钱又省时间。

基础命令 SET key value 存数据,GET key 取数据,EXPIRE key seconds 设置过期时间,DEL key 删除,EXISTS key 检查是否存在。过期时间非常重要,AI 生成结果不需要永久缓存,设置合理的过期时间可以避免内存被撑满。

在 Python 里使用 安装 redis-py,连接 Redis 后就可以像操作字典一样存取数据。存之前用 json.dumps() 把 Python 对象序列化成字符串,取出来再用 json.loads() 反序列化回来。

注意事项 Redis 默认数据存在内存,断电或重启后数据会丢失(可以开启持久化但默认不开)。所以 Redis 适合存"丢了也无所谓、可以重新生成"的数据,不适合存用户账号、订单这类重要数据。

在 AIGC 产品里的价值 AI 模型调用成本高、耗时长,相同的输入大概率产出相同的结果。用 Redis 缓存这些结果,能大幅降低 API 调用费用,也能显著提升用户体验。


三、RabbitMQ

是什么 消息队列中间件。解决的核心问题是:系统在高并发时,不能让所有请求同时涌入后端处理,需要一个"缓冲地带"来排队。

核心模型 生产者负责把任务发送到队列,消费者负责从队列里取出任务并处理。两者解耦,互不直接依赖。生产者发完就走,不需要等消费者处理完;消费者按自己的节奏处理,不会被生产者的速度压垮。

为什么 AIGC 产品需要它 AI 模型处理一个请求需要几秒甚至几十秒。如果 100 个用户同时点击生成,直接全部打到模型上,要么模型崩溃,要么全部超时。有了 RabbitMQ,100 个任务进入队列排队,消费者按顺序一个一个处理,系统稳定,用户也知道自己在排队等待。

核心概念 Exchange 是消息交换机,决定消息路由到哪个队列。Queue 是队列本身,存放待处理的消息。Binding 是 Exchange 和 Queue 之间的绑定关系。对于简单场景,用默认 Exchange 直接发到指定队列名就够了。

在 Python 里使用pika 库连接 RabbitMQ,生产者用 channel.basic_publish() 发消息,消费者用 channel.basic_consume() 监听队列,收到消息后执行回调函数处理。

管理界面 RabbitMQ 带一个 Web 管理界面(装 management 版本后访问 localhost:15672),可以看到队列里有多少消息在等待、消费者的处理速度、历史消息量等信息,排查问题很方便。

消息确认机制 消费者处理完消息后需要发送 ACK(确认),告诉 RabbitMQ 这条消息已经处理好了可以删除。如果消费者处理到一半崩了,没有发 ACK,RabbitMQ 会把这条消息重新放回队列,确保任务不丢失。


四、Docker

是什么 容器化平台,把应用和它所依赖的所有运行环境(Python 版本、依赖库、系统配置)打包成一个镜像,在任何机器上都能一致地运行。彻底解决"在我电脑上能跑,在服务器上不行"的问题。

镜像与容器的区别 镜像是静态的打包文件,相当于蛋糕的配方;容器是镜像运行起来的实例,相当于按配方做出来的蛋糕。同一个镜像可以同时运行多个容器。

Dockerfile 描述如何构建镜像的文件。FROM 指定基础镜像(比如 python:3.12),WORKDIR 设置工作目录,COPY 把本地文件复制进镜像,RUN 执行命令(比如安装依赖),CMD 指定容器启动时执行的命令。写好 Dockerfile 后用 docker build 构建镜像。

常用命令 docker build -t 镜像名 . 构建镜像,docker run -p 8000:8000 镜像名 运行容器(-p 是端口映射,把容器内的端口暴露到宿主机),docker ps 查看运行中的容器,docker stop 容器ID 停止容器,docker logs 容器ID 查看日志。

docker-compose 用一个 docker-compose.yml 文件定义多个服务(比如 FastAPI + Redis + RabbitMQ),用 docker-compose up 一键全部启动,docker-compose down 全部停止。团队里新同事拿到代码,不需要手动安装各种依赖,一个命令就能把整套环境跑起来,极大降低协作成本。

在公司里的意义 公司的项目在本地开发完后,需要部署到服务器上线。Docker 保证本地和服务器的环境完全一致,避免部署时出现各种环境差异问题。理解 Docker 也是理解公司整个部署流程的前提。


五、Python 语法要点

虚拟环境 venv 为每个项目创建独立的 Python 环境,避免不同项目的依赖版本互相冲突。用 python -m venv venv 创建,激活后安装的所有库只属于这个项目。是 Python 项目开发的基本规范。

async / await 异步编程的核心语法。async def 定义一个协程函数,await 在调用耗时操作时主动交出控制权,让事件循环去处理其他任务,等操作完成后再回来继续。适合 IO 密集型场景(网络请求、文件读写),能大幅提升并发性能。

装饰器 @ 本质是一个高阶函数,用来给另一个函数附加功能,语法是在函数定义上方加 @装饰器名。FastAPI 里的 @app.get("/") 是把函数注册为路由,@app.middleware 是注册中间件。理解装饰器就理解了 FastAPI 路由的工作原理。

类型注解 在变量和函数参数后面加 : 类型 标注数据类型,比如 name: strage: intitems: List[str]。Python 本身不强制执行类型,但 FastAPI 和 Pydantic 会用它自动做数据校验。也让代码更易读,别人一眼就知道这个参数应该传什么类型。

Pydantic BaseModel 用 class 继承 BaseModel 定义数据模型,字段用类型注解声明。实例化时自动校验数据类型,类型不对会抛出异常。FastAPI 深度集成 Pydantic,请求体的校验、响应数据的序列化全靠它。

模块与 import import module 导入整个模块,用 module.function() 调用。from module import function 只导入某个函数,直接用 function() 调用。大项目按功能拆分成多个文件,通过 import 互相引用。__init__.py 文件让一个目录变成 Python 包,可以被 import。

列表推导式 [expression for item in iterable if condition] 的简洁写法,比 for 循环更紧凑。比如 [x * 2 for x in range(10) if x % 2 == 0]。公司代码里经常见到,要能一眼看懂。

字典常用操作 .get(key, default) 安全取值,key 不存在时返回 default 而不是报错;.items() 遍历键值对;.keys().values() 分别取所有键和值;{**dict1, **dict2} 合并两个字典。

with 语句 上下文管理器,确保资源在使用完后被正确释放,比如文件关闭、数据库连接释放。with open("file.txt") as f: 是最常见的用法,即使中间出错也会自动关闭文件。

f-string f"Hello {name}, you are {age} years old" 的字符串格式化方式。花括号里可以放任意 Python 表达式,简洁直观。是目前 Python 最推荐的字符串拼接方式。


六、整体链路

用户点击生成
    ↓
FastAPI 接收请求,Pydantic 校验参数
    ↓
检查 Redis 是否有缓存
    ↓ 有缓存          ↓ 无缓存
直接返回结果    任务发入 RabbitMQ 队列
                    ↓
              消费者取出任务
                    ↓
              调用 AI 模型处理
                    ↓
              结果写入 Redis 缓存
                    ↓
              返回给用户
                    ↓
整个服务打包成 Docker 容器部署上线

这条链路是大多数 AIGC 产品后端的基础骨架。FastAPI 负责接口层,Redis 负责缓存层,RabbitMQ 负责任务调度层,Docker 负责部署层。四个组件各司其职,组合在一起构成一个稳定、可扩展的后端系统。理解这条链路,就理解了你们公司技术架构的核心逻辑。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐