🌍 前言(深度补充)

目前网上绝大多数AI架构文章,只讲模型部署、Docker、显卡参数,从来不讲商用平台真实线上痛点、架构矛盾、底层取舍

市面上主流AI产品(豆包、通义、讯飞、文心),完整架构分为四大块,并且每一块都有无法规避的架构矛盾、线上坑点、取舍设计

  1. 存储架构:几千万条聊天记录怎么存、怎么不炸库、冷热数据怎么切割。

  2. 生产避坑架构:消息重复、乱序、丢失、大报文击穿、数据库抖动。

  3. 部署调度架构:GPU显存调度、会话绑定、排队冲突、算力分配。

  4. 商用隐藏模块:风控、审核、隔离、显存污染、灰度、多活。

本文区别于普通精简合集,保留所有底层深挖、架构矛盾、面试硬核问题、线上真实事故、底层源码逻辑。全文无废话、纯生产深度剖析,适合后端进阶、架构设计、高级面试。


一、AI聊天系统整体总架构(全景链路+深度解析)


用户端 ↓ 网关层(限流、防刷、黑白名单) ↓ 调度中台(排队、负载、路由、熔断、绑定GPU) ↓ 模型集群池(多卡、多模型隔离部署) ↓ GPU推理服务(KV缓存、流式生成) ↓ 结果回调+Redis缓存会话 ↓ Kafka异步落库(最终持久化)

整条链路分为:接入层 → 调度层 → 推理层 → 缓存层 → 存储层

【深度剖析】为什么AI系统链路比普通后端长?

普通后端业务瓶颈在数据库;AI聊天系统是双瓶颈:GPU算力瓶颈 + 存储IO瓶颈

普通接口耗时1~20ms,AI推理耗时500ms~5s,且GPU显存不可扩容、不可随意回收,所以必须多加一层调度中台做流量管控,这是普通业务没有的中间层。


二、存储架构:千万级聊天记录怎么存?(深度加厚)

2.1 核心痛点(深挖)

  • 数据量级爆炸:一条对话多轮交互,单日产生千万条消息,单月上亿。

  • 冷热数据极端分化:95%用户只看最近7天记录,历史数据永久冷置。

  • 文本字段超大:AI返回大模型文本,单条报文可达10KB~50KB,极易撑爆MySQL行存储。

  • 读写流量极端不均:白天高频读写、凌晨几乎零流量。

2.2 最终存储架构(大厂通用+底层取舍)

1、MySQL:分库分表 + 冷热分离
  • 分片规则:用户ID哈希分片。保证同一个用户所有对话落在同一张表,避免跨表联查、避免分布式事务。

  • 冷热切割线固定7天:大厂统一标准,7天是用户活跃临界值。

  • 热数据:近7天数据,保留MySQL,支持快速查询。

  • 冷数据:7天前自动迁移OSS,压缩归档。

【架构反问】为什么不用时间分片?

时间分片会导致:一个用户聊天分散在几十张表,查询历史会话需要遍历全部分片,查询性能爆炸。

2、Redis:会话缓存 + 上下文缓存
  • 存储:用户会话ID、最近上下文、临时状态、用户额度、绑定GPU节点。

  • 淘汰策略:采用volatile-lru,优先淘汰长时间不活跃会话。

  • 核心作用:避免频繁回查MySQL,做到点开对话秒加载

【线上坑点】Redis会话缓存不能永久存储,必须设置过期时间,否则千万用户会撑爆Redis内存。

3、Kafka:异步削峰 + 最终落库
  • 硬性规则:AI生成绝对不能同步写MySQL

  • AI流式生成耗时极长,同步写入会导致接口超时、连接堆积。

  • 所有消息先入MQ,异步批量写入数据库。

【深度原理】AI流量属于脉冲流量,瞬间爆发,必须依靠MQ削峰抹平流量波峰。

4、OSS对象存储:冷数据归档
  • 将过期聊天记录压缩为JSON/Parquet,廉价存储。

  • 用户查看冷数据时,临时解压加载到Redis,读完自动销毁。

5、ES搜索引擎:全局聊天检索
  • MySQL不支持中文分词、模糊检索。

  • 所有聊天记录实时同步ES,用于全局搜索、审计、风控。

2.3 存储架构总结(进阶口诀)

MySQL扛热数据、OSS存冷数据、Redis做会话缓存、Kafka削峰、ES做检索;分片规避单表爆炸,冷热分离降低存储成本。


三、生产避坑架构:线上99%人会踩的致命问题(加厚深挖)

3.1 聊天重复、消息乱序问题

解决方案:全局唯一消息ID + 幂等写入
  • 全链路透传traceId,从网关→调度→GPU→存储,唯一标识一条消息。

  • 数据库增加唯一索引,重复消息直接忽略。

  • Kafka开启幂等生产者+事务消息,防止重复消费。

【线上事故】早期AI平台没有幂等,用户频繁刷新页面,导致数据库出现大量重复对话、重复AI回复。

3.2 消息丢失、断连丢失上下文

解决方案:三级缓存+预写入机制
  • 第一级:前端本地缓存草稿。

  • 第二级:Redis预写入,消息先缓存再推理。

  • 第三级:MQ持久化,保证宕机不丢消息。

3.3 大报文、超长对话拖垮数据库

解决方案:大文本切片存储
  • MySQL单字段最大限制、大文本会导致页分裂、表膨胀、查询变慢。

  • 超过2000字符的AI回复,全部上传OSS,数据库只存URL索引。

3.4 高峰期数据库压力爆炸

解决方案:多层限流+延迟落库
  • 网关限流:拦截恶意流量。

  • MQ削峰:缓冲瞬时流量。

  • 批量落库:消费端合并多条消息一次性写入。

3.5 线上事故兜底方案

  • 数据库宕机:临时切Redis缓存留存消息,恢复后批量补落库。

  • MQ堆积:扩容分区、提高消费线程、死信队列隔离异常消息。


四、部署调度架构:GPU集群怎么扛住千万并发?(全文最难、最深、最硬核)

4.1 大模型和普通接口本质区别(底层深挖)

  • 耗时极长:普通接口5ms,AI推理500ms~5s,长文本可达10s+。

  • 资源稀缺不可扩容:显存是物理硬件,不能像CPU无限扩线程。

  • 流量极端不均:晚间流量是白天10倍。

  • 不可随意重分配:KV缓存绑定显存,换卡必须重算上下文。

4.2 模型集群部署方式

1、多卡多实例部署
  • 一台物理机8卡/16卡,一张卡部署一个模型实例

  • 禁止一张卡多模型混跑,会互相抢占显存、互相污染。

2、模型物理隔离(重中之重)
  1. 通用对话模型:日常聊天,流量最大。

  2. 长文本模型:总结、代码、文案,显存占用高。

  3. 创意生成模型:写诗、角色扮演,耗时最长。

  4. 轻量化兜底模型:高峰期降级使用,保证可用。

【底层逻辑】隔离目的:防止慢请求拖垮全部集群。长文本一次推理占用显存几秒,混跑会卡死普通用户。

4.3 核心:显存负载调度算法(你最关心的深度原理)

大模型绝对不用Nginx轮询、不能随机分配,采用综合负载得分算法

1、打分公式(大厂公开商用权重)
// 分数越低,显卡越空闲,优先分配
double score = 
  显存占用率 * 0.6 
+ 当前排队数 * 0.3 
+ 平均推理耗时系数 * 0.1;
  • 显存权重0.6:显存爆了直接卡死,权重最高。

  • 排队权重0.3:防止队列堆积。

  • 耗时权重0.1:剔除卡顿异常显卡。

2、数据来源(全网很少讲透)

灵魂疑问:调度中台的GPU列表 List<GpuInstance> 哪里来?

  • GPU服务每200ms主动上报心跳接口。

  • 上报内容:显存占用、排队数、健康状态、推理耗时。

  • 调度中台本地内存缓存GPU列表,不查库、不远程拉取。

  • 调度判断耗时:亚毫秒级。

【为什么不能实时拉取?】GPU集群几十上百台,实时HTTP拉取延迟太高,调度必须内存本地查表。

3、负载算法完整代码(生产简化版)
public class GpuLoadBalancer {
    // 选出当前最优显卡
    public GpuInstance getBestInstance(List<GpuInstance> list){
        GpuInstance best = null;
        double minScore = Double.MAX_VALUE;
        for(GpuInstance instance : list){
            // 故障节点直接剔除
            if(!instance.isHealthy()) continue;
            // 综合负载打分
            double score = instance.getVramUsage() * 0.6
                         + instance.getQueueSize() * 0.3
                         + instance.getAvgInferTime() * 0.1;
            if(score < minScore){
                minScore = score;
                best = instance;
            }
        }
        return best;
    }
}
// GPU节点实体(心跳上报实体)
class GpuInstance{
    private boolean healthy;
    private double vramUsage;
    private int queueSize;
    private double avgInferTime;
}

4.4 致命架构矛盾:负载均衡 VS 会话绑定(深度拆解)

所有人都会疑惑的矛盾点:

前面写谁空闲分给谁,后面又写同一个会话绑定一张GPU,到底冲不冲突?

1、优先级规则(核心底层逻辑)

会话绑定规则 > 显存负载调度算法

  • 全新会话:无上下文,走负载算法,挑最闲显卡。

  • 历史会话:有KV缓存,强制绑定旧显卡,无视负载。

2、KV缓存底层原理

大模型每一轮对话,都会在显存生成KV缓存(上下文张量)。

如果强行换卡:必须重新编码全部历史对话,推理耗时暴涨3~10倍,用户肉眼可见卡顿。

3、强制解绑兜底规则
  • 绑定显卡显存超过85%,强制迁移,清空KV缓存。

  • 心跳连续3次断连,直接剔除集群。

4.5 排队机制:Redis ZSet优先级队列(为什么不用MQ?)

1、底层原因

Kafka、RabbitMQ严格先进先出,不支持插队、不支持动态优先级

AI平台必须区分:普通用户、会员、超级会员。

2、排序公式
score = 时间戳 - 会员权重
  • 普通用户:权重0。

  • 会员:-20000。

  • 超级会员:-50000。

ZSet从小到大排序,分数越小越靠前,天然插队。

3、三类物理队列隔离
  1. vip队列:优先级最高。

  2. normal队列:普通用户。

  3. slow队列:超长文本、坏请求。

4、防饥饿机制(大厂隐藏规则)

普通用户排队超过60s,自动降低score,缓慢往前排,防止永久被会员插队卡死。

4.6 失败分级处理机制

  • 瞬时报错:自动重试1~2次,用户无感知。

  • 单卡崩溃:心跳断连、剔除集群、流量转移。

  • 集群拥堵:熔断降级,切轻量化模型兜底。

  • 用户断连:立刻终止推理、释放显存、杜绝算力浪费。

4.7 GPU显存GC问题(后端必懂、对比JVM)

1、直白结论

GPU没有JVM自动垃圾回收,属于裸金属手动内存。

2、JVM vs GPU显存 底层对比

对比维度

JVM(CPU内存)

GPU显存(AI推理)

内存管控

虚拟机自动托管

手动申请、手动释放

垃圾回收

分代GC、自动清理

无全自动GC

内存碎片

GC压缩整理

只会堆积、不会合并

停顿影响

短暂停顿

禁止停顿

3、大厂三种显存回收方案
  1. 请求级回收:对话结束、断连立刻销毁KV缓存。

  2. 会话过期回收:5~10分钟无对话,清空上下文。

  3. 定时重启重置:每2~4小时重启显卡实例,清除显存碎片。

4、为什么英伟达不做自动GC?
  • GC停顿会打断流式生成,造成打字机卡顿。

  • AI推理需要连续显存,内存整理会打乱张量布局。

  • 自动回收占用显卡算力,降低吞吐。


五、商用隐藏模块:90%文章不会讲的底层能力(加厚完整版)

5.1 Token计费与额度风控

  • 前端统计token永远不准,必须模型层精准统计

  • Redis原子计数器限制用户每日额度。

  • 恶意用户高频请求直接拉黑,防止薅空算力。

5.2 双链路内容审核

  • 前置审核:拦截用户违规输入,不让进模型。

  • 后置审核:过滤模型违规输出。

  • 审核服务独立集群,绝不占用GPU算力。

5.3 用户强隔离机制

  • 全链路透传userId,缓存、MQ、显存全部隔离。

  • 杜绝线上事故:A用户看到B用户AI回复。

5.4 显存污染治理

  • 长时间推理产生残留张量、显存碎片。

  • 现象:显卡越跑越慢、显存只升不降。

  • 方案:定时优雅重启,物理清空显存。

5.5 坏请求隔离池

  • 超长文本、畸形prompt、乱码单独隔离。

  • 不占用普通用户推理卡。

  • 超时强制kill,防止单卡卡死。

5.6 模型灰度A/B测试

  • 小流量灰度上线新模型,降低上线风险。

  • 同一用户固定模型版本,避免体验跳动。

5.7 异地多活容灾

  • 多机房部署,断电、断网自动切换。

  • 用户就近接入,降低网络延迟。

5.8 全链路追踪审计

  • 每条对话唯一traceId,贯穿全链路。

  • 卡顿、报错、显存峰值、排队时长全部记录。


六、全文终极总结(架构师直白深度总结)

6.1 四大架构能力分工

  1. 存储架构:解决存得下 —— 冷热分离、分库分表、异步落库。

  2. 生产避坑:解决稳得住 —— 防重复、防丢失、防击穿。

  3. 部署调度:解决扛得住 —— GPU池化、负载算法、会话绑定、排队限流。

  4. 隐藏模块:解决能商用 —— 风控、审核、隔离、显存治理、容灾。

6.2 核心灵魂口诀(进阶完整版)

  • 存储:热数据放MySQL,冷数据丢归档,缓存全部扔Redis。

  • 调度:新请求看负载,老请求看绑定,快崩才强制迁移。

  • 显存:GPU没有自动GC,全靠手动回收+定时重启除污染。

  • 线上:限流排队防打爆,隔离降级保核心,异步落库防丢失。

6.3 写给后端开发者

AI后台不是单纯调用模型接口,它是存储+网络+算力+调度+风控的综合型复杂架构

看懂这篇深度合集,你已经具备一线大厂千万级AI聊天平台的独立设计能力,面试、自研、工作架构设计,完全吊打95%普通后端开发者。

Logo

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

更多推荐