共计 1826 个字符,预计需要花费 5 分钟才能阅读完成。
背景痛点
在开发基于 ChatGPT 的问答系统时,我们经常会遇到用户频繁提问导致页面卡死的情况。这主要是因为传统的同步请求处理模式存在以下瓶颈:

- 每个请求都需要等待 ChatGPT 的完整响应后才能继续处理下一个请求
- 高并发场景下,服务器线程 / 进程会被迅速占满
- 长时间运行的 AI 模型推理会阻塞 I / O 事件循环
- 浏览器主线程被阻塞导致 UI 无响应
技术方案
1. 消息队列异步化
通过引入 RabbitMQ 或 Kafka 等消息队列,我们可以将请求处理流程解耦:
- 前端发送问题到 API 网关
- 网关将问题发布到消息队列
- 独立的工作者进程消费队列并调用 ChatGPT API
- 处理完成后将结果存入数据库
2. WebSocket 实时反馈
为了避免用户等待时的空白期,我们采用 WebSocket 实现:
- 建立持久连接推送处理状态(排队中 / 处理中)
- 实时返回部分生成结果(流式传输)
- 最终完成时发送完整响应
3. Redis 缓存优化
对于高频重复问题,引入多级缓存策略:
- 短期缓存:Redis 存储最近 10 分钟的问答对
- 长期缓存:对通用性问题建立知识库
- 相似问题匹配:使用向量数据库做语义缓存
代码实现(Node.js 示例)
生产者端
// 消息队列生产者
const amqp = require('amqplib');
async function publishQuestion(question) {const conn = await amqp.connect('amqp://localhost');
const channel = await conn.createChannel();
const queue = 'chatgpt_questions';
await channel.assertQueue(queue, { durable: true});
channel.sendToQueue(queue,
Buffer.from(JSON.stringify({
question,
timestamp: Date.now()})),
{persistent: true}
);
console.log(`[x] Sent ${question}`);
setTimeout(() => conn.close(), 500);
}
消费者端
// 消费者处理逻辑
const {ChatGPTAPI} = require('chatgpt');
async function processQuestion(msg) {const content = msg.content.toString();
const {question} = JSON.parse(content);
try {const api = new ChatGPTAPI({ apiKey: process.env.OPENAI_KEY});
const res = await api.sendMessage(question, {onProgress: (partialResponse) => {
// 通过 WebSocket 推送部分结果
websocketServer.clients.forEach(client => {
client.send(JSON.stringify({
status: 'processing',
text: partialResponse.text
}));
});
}
});
// 存储最终结果
await cache.set(`chatgpt:${question}`, res.text, 'EX', 600);
channel.ack(msg);
} catch (err) {console.error(` 处理失败: ${err}`);
channel.nack(msg);
}
}
性能优化
吞吐量对比
| 模式 | QPS | 平均延迟 | 资源占用 |
|---|---|---|---|
| 同步 | 15 | 2.3s | 高 |
| 异步 | 120 | 1.8s | 中 |
消息积压处理
- 动态扩展消费者数量
- 实施消息 TTL 和死信队列
- 降级策略:返回缓存结果或简化模型
避坑指南
WebSocket 连接限制
- Nginx 默认支持 1024 个并发连接
- 解决方案:
- 调整
worker_connections配置 - 使用多机负载均衡
- 实现连接心跳检测
消息幂等性
- 为每条消息生成唯一 ID
- 消费者维护处理状态表
- 实现去重中间件
缓存雪崩预防
- 设置差异化过期时间
- 实现多级缓存回退
- 使用布隆过滤器避免缓存穿透
总结展望
当前方案已能有效解决高频问答场景下的页面卡死问题,后续可考虑:
- 引入边缘计算减少网络延迟
- 实现模型量化加速推理
- 探索 WebAssembly 优化前端性能
- 构建自适应负载均衡系统
通过持续优化,我们能够为用户提供更加流畅的 AI 对话体验,同时保证系统在高并发场景下的稳定性。
正文完
