199 lines
4.6 KiB
Markdown
199 lines
4.6 KiB
Markdown
# 多并发支持规划 (100 持续在线用户)
|
|
|
|
## Context
|
|
|
|
用户需要为 AI Chat UI 项目支持 100 个持续在线用户,需要数据持久化,使用裸机部署 (systemd 服务管理)。
|
|
|
|
## 需求确认
|
|
- **并发类型**: 持续在线 (日常稳定有100个用户在线使用)
|
|
- **会话存储**: 需要持久化 (支持多实例部署)
|
|
- **部署方式**: 裸机部署 (systemd 管理)
|
|
|
|
---
|
|
|
|
## 实现方案
|
|
|
|
### 阶段 1: 后端多进程支持 (核心)
|
|
|
|
**目标**: 使用 Gunicorn + Uvicorn workers 实现多进程
|
|
|
|
**修改文件**:
|
|
1. `server/requirements.txt` - 添加 gunicorn
|
|
2. 新建 `server/gunicorn.conf.py` - Gunicorn 配置文件
|
|
3. 新建 `server/start.sh` - 启动脚本
|
|
|
|
**关键配置** (`server/gunicorn.conf.py`):
|
|
```python
|
|
import multiprocessing
|
|
|
|
workers = multiprocessing.cpu_count() * 2 + 1 # 推荐配置
|
|
worker_class = "uvicorn.workers.UvicornWorker"
|
|
bind = "0.0.0.0:8000"
|
|
keepalive = 120
|
|
timeout = 300 # AI 响应可能较慢
|
|
graceful_timeout = 30
|
|
```
|
|
|
|
---
|
|
|
|
### 阶段 2: 会话持久化 (Redis)
|
|
|
|
**目标**: 使用 Redis 替代内存存储,支持多进程共享数据
|
|
|
|
**修改文件**:
|
|
1. `server/requirements.txt` - 添加 redis
|
|
2. 新建 `server/utils/redis_store.py` - Redis 存储层
|
|
3. 修改 `server/api/chat_routes.py` - 替换 `conversations_db` 字典
|
|
|
|
**Redis 数据结构设计**:
|
|
```
|
|
conversations:{conversation_id} -> JSON (单个对话详情)
|
|
conversations:list -> Sorted Set (按更新时间排序的ID列表)
|
|
```
|
|
|
|
**安装 Redis (Ubuntu/Debian)**:
|
|
```bash
|
|
sudo apt install redis-server
|
|
sudo systemctl enable redis-server
|
|
sudo systemctl start redis-server
|
|
```
|
|
|
|
---
|
|
|
|
### 阶段 3: 请求限流
|
|
|
|
**目标**: 防止 API 过载
|
|
|
|
**修改文件**:
|
|
1. `server/requirements.txt` - 添加 slowapi
|
|
2. 新建 `server/middleware/rate_limit.py`
|
|
3. 修改 `server/main.py` - 注册限流中间件
|
|
|
|
**限流策略**:
|
|
- 聊天接口: 30 请求/分钟/IP (长连接场景)
|
|
- 其他接口: 100 请求/分钟/IP
|
|
|
|
---
|
|
|
|
### 阶段 4: Systemd 服务配置
|
|
|
|
**新建文件**: `server/ai-chat.service`
|
|
|
|
```ini
|
|
[Unit]
|
|
Description=AI Chat Backend Service
|
|
After=network.target redis.service
|
|
|
|
[Service]
|
|
Type=exec
|
|
User=mt
|
|
WorkingDirectory=/home/mt/project/ai-chat-ui/server
|
|
Environment="PATH=/home/mt/project/ai-chat-ui/server/.venv/bin"
|
|
Environment="LLM_BACKEND=glm"
|
|
Environment="REDIS_URL=redis://localhost:6379"
|
|
ExecStart=/home/mt/project/ai-chat-ui/server/.venv/bin/gunicorn main:app -c gunicorn.conf.py
|
|
Restart=always
|
|
RestartSec=5
|
|
|
|
[Install]
|
|
WantedBy=multi-user.target
|
|
```
|
|
|
|
**安装服务**:
|
|
```bash
|
|
sudo cp server/ai-chat.service /etc/systemd/system/
|
|
sudo systemctl daemon-reload
|
|
sudo systemctl enable ai-chat
|
|
sudo systemctl start ai-chat
|
|
```
|
|
|
|
---
|
|
|
|
### 阶段 5: Nginx 反向代理 (可选但推荐)
|
|
|
|
**新建文件**: `nginx/ai-chat.conf`
|
|
|
|
```nginx
|
|
upstream backend {
|
|
server 127.0.0.1:8000;
|
|
keepalive 32;
|
|
}
|
|
|
|
server {
|
|
listen 80;
|
|
server_name your-domain.com;
|
|
|
|
# 前端静态文件
|
|
location /chat-ui/ {
|
|
root /home/mt/project/ai-chat-ui/dist;
|
|
try_files $uri $uri/ /index.html;
|
|
}
|
|
|
|
# API 代理
|
|
location /api/ {
|
|
proxy_pass http://backend;
|
|
proxy_http_version 1.1;
|
|
proxy_set_header Host $host;
|
|
proxy_set_header X-Real-IP $remote_addr;
|
|
|
|
# SSE 支持
|
|
proxy_set_header Connection '';
|
|
proxy_buffering off;
|
|
proxy_cache off;
|
|
proxy_read_timeout 300s;
|
|
}
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## 关键文件修改清单
|
|
|
|
| 文件 | 操作 | 说明 |
|
|
|------|------|------|
|
|
| `server/requirements.txt` | 修改 | 添加 gunicorn, redis, slowapi |
|
|
| `server/gunicorn.conf.py` | 新建 | 多进程配置 |
|
|
| `server/start.sh` | 新建 | 启动脚本 |
|
|
| `server/utils/redis_store.py` | 新建 | Redis 存储层 |
|
|
| `server/api/chat_routes.py` | 修改 | 集成 Redis 存储 |
|
|
| `server/middleware/rate_limit.py` | 新建 | 限流中间件 |
|
|
| `server/main.py` | 修改 | 注册中间件 |
|
|
| `server/ai-chat.service` | 新建 | Systemd 服务配置 |
|
|
|
|
---
|
|
|
|
## 验证方案
|
|
|
|
1. **服务状态检查**:
|
|
```bash
|
|
sudo systemctl status ai-chat
|
|
curl http://localhost:8000/health
|
|
```
|
|
|
|
2. **并发压测**:
|
|
```bash
|
|
# 安装 wrk
|
|
sudo apt install wrk
|
|
# 测试 100 并发
|
|
wrk -t4 -c100 -d30s http://localhost:8000/api/chat-ui/models
|
|
```
|
|
|
|
3. **Redis 验证**:
|
|
```bash
|
|
redis-cli ping
|
|
redis-cli keys "conversations:*"
|
|
```
|
|
|
|
4. **日志监控**:
|
|
```bash
|
|
sudo journalctl -u ai-chat -f
|
|
```
|
|
|
|
---
|
|
|
|
## 风险与注意事项
|
|
|
|
1. **SSE 长连接** - Gunicorn 需要配置 `keepalive` 和 `timeout`
|
|
2. **Redis 内存** - 根据对话数量规划,建议至少 512MB
|
|
3. **API 配额** - 智谱/阿里云 API 有速率限制,注意监控
|
|
4. **日志轮转** - 配置 logrotate 防止日志文件过大 |