zhibo/直播IM系统开发指南.md

1601 lines
39 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 直播IM系统开发指南
> **版本**: v3.0 | **更新时间**: 2024年12月25日 | **维护状态**: 🟢 活跃开发中
## 📋 目录
- [项目概述](#项目概述)
- [系统架构](#系统架构)
- [核心模块](#核心模块)
- [开发任务清单](#开发任务清单)
- [技术实现要点](#技术实现要点)
- [部署配置](#部署配置)
- [测试要点](#测试要点)
- [常见问题](#常见问题)
- [开发进度](#开发进度)
---
## 📖 项目概述
### 目标
搭建一个支持 **1-5万在线用户** 的直播+社交IM系统单机部署
### 技术栈
- **后端框架**: Spring Boot
- **实时通信**: WebSocket (Netty)
- **数据库**: MySQL 8.0
- **缓存**: Redis 6.0
- **反向代理**: Nginx
- **开发语言**: Java 8+
### 核心场景
- ✅ 直播间实时弹幕(支持千人直播间)
- ✅ 用户一对一私聊
- ✅ 好友关系管理
- ✅ 礼物打赏(直播间+私聊)
- ✅ 多媒体消息(图片、语音、视频)
- ⚠️ 社交互动通知(部分完成)
### 性能目标(单机)
| 指标 | 目标值 |
|------|--------|
| WebSocket连接数 | 5万+ |
| 消息吞吐量 | 5000条/秒 |
| 接口响应时间 (P99) | <100ms |
| 直播间弹幕延迟 | <200ms |
| 系统可用性 | 99%+ |
---
## 🏗️ 系统架构
### 整体架构图
```
客户端 (Android/iOS/Web)
Nginx (负载均衡 + WebSocket代理)
Spring Boot应用
├── WebSocket服务 (Netty)
├── HTTP API服务
├── 消息路由服务
└── 业务逻辑服务
数据层
├── MySQL (持久化存储)
├── Redis (缓存 + 在线状态 + 离线消息)
└── 文件存储 (本地/OSS)
```
---
## 🧩 核心模块
### 模块1用户认证模块 ✅
**功能清单**
- 用户注册/登录
- JWT Token生成与验证
- Token刷新机制
- 用户信息管理
**核心类**
- `LoginController` - 认证接口
- `JwtUtil` - JWT工具类
- `AuthService` - 认证业务逻辑
- `UserService` - 用户管理
---
### 模块2WebSocket连接管理模块 ✅
**功能清单**
- WebSocket连接建立
- 用户在线状态管理
- 心跳检测30秒间隔
- 断线重连处理
- 连接映射维护userId WebSocket Session
**核心类**
- `WebSocketConfig` - WebSocket配置
- `LiveChatHandler` - 直播间消息处理器
- `PrivateChatHandler` - 私聊消息处理器
- `HeartbeatScheduler` - 心跳检测定时任务
- `OnlineStatusService` - 在线状态服务
**关键流程**
| 事件 | 处理逻辑 |
|------|----------|
| 用户连接 | 保存连接 更新Redis在线状态 拉取离线消息 |
| 用户断开 | 移除连接 更新Redis状态 清理直播间在线列表 |
| 心跳超时 | 自动断开连接90秒超时 |
---
### 模块3消息路由模块 ✅
**功能清单**
- 单聊消息路由点对点
- 群聊消息广播直播间
- 消息分发逻辑
- 离线消息处理
**核心类**
- `MessageRouter` - 消息路由器内置在Handler中
- `MessageDispatcher` - 消息分发器内置在Handler中
- `LiveChatHandler` - 广播服务
- `OfflineMessageService` - 离线消息服务
**路由策略**
```
单聊消息:
查询接收者在线状态
├── 在线 → 通过WebSocket直接推送
└── 离线 → 存入Redis离线消息队列
直播间消息:
获取房间所有在线用户Redis Set
└── 批量异步推送(线程池处理)
```
---
### 模块4消息存储模块 ✅
**功能清单**
- 消息持久化MySQL
- 消息缓存Redis7天TTL
- 历史消息查询
- 离线消息队列
- 消息已读状态
**核心类**
- `LiveChatService` - 消息业务逻辑
- `LiveChatDao` - 消息数据访问
- `OfflineMessageService` - 消息缓存服务
- `ConversationService` - 会话管理
**存储策略**
| 存储层 | 用途 | 策略 |
|--------|------|------|
| MySQL | 持久化存储 | 所有消息先存MySQL |
| Redis | 热点缓存 | 7天TTL加速查询 |
| Redis List | 离线消息 | 最多100条7天过期 |
| 分页查询 | 历史消息 | 按时间倒序20条/ |
---
### 模块5好友关系模块 ✅
**功能**
- 添加好友发送申请)✅
- 处理好友申请同意/拒绝)✅
- 删除好友
- 好友列表查询
- 用户搜索
- 好友在线状态
**已实现的类:**
- `FriendController` - 好友接口
- 搜索用户 (GET /api/front/users/search)
- 发送好友请求 (POST /api/front/friends/request)
- 获取好友请求列表 (GET /api/front/friends/requests)
- 处理好友请求 (POST /api/front/friends/requests/{requestId}/handle)
- 获取好友列表 (GET /api/front/friends)
- 删除好友 (DELETE /api/front/friends/{friendId})
**业务流程:**
- 发送申请 保存申请记录 推送通知给对方
- 同意申请 双向添加好友关系 推送通知 创建会话
- 删除好友 删除好友关系 保留历史消息
**数据库表:**
- `eb_friend` - 好友关系表
- `eb_friend_request` - 好友申请表
---
### 模块6直播间管理模块 ✓
**功能**
- 进入直播间
- 离开直播间
- 直播间在线用户列表
- 直播间弹幕发送
- 直播间人数统计
**需要实现的类:**
- `LiveRoomController` - 直播间接口
- `LiveRoomService` - 直播间业务逻辑
- `RoomMemberService` - 房间成员管理 (内置在Handler中)
- `BarrageService` - 弹幕服务 (LiveChatService)
**关键功能:**
- 进入房间加入Redis Set广播进入消息返回房间信息
- 发送弹幕频率限制1秒1条)⚠敏感词过滤 广播给所有人
- 离开房间从Redis Set移除广播离开消息
---
### 模块7礼物打赏模块 ✓
**功能**
- 礼物列表管理
- 直播间送礼
- 私聊送礼
- 礼物记录查询
- 余额扣除与收益增加
**需要实现的类:**
- `GiftController` - 礼物接口
- `GiftService` - 礼物业务逻辑
- `GiftRecordService` - 礼物记录服务
- `RechargeOptionService` - 充值选项服务
- `UserService` - 用户余额管理 (已有)
- `UserBillService` - 用户账单服务 (已有)
**业务流程:**
- 验证余额 扣除金币 增加收益 保存记录 生成账单 返回结果
**数据库表:**
- `eb_gift` - 礼物表
- `eb_gift_reward_record` - 礼物打赏记录表
- `eb_gift_detail` - 送礼物明细表
- `eb_gift_quantity` - 礼物数量列表充值选项)✓
**API接口**
- `GET /api/front/gift/list` - 获取礼物列表
- `GET /api/front/gift/balance` - 获取用户余额
- `POST /api/front/gift/send` - 赠送礼物
- `GET /api/front/gift/recharge/options` - 获取充值选项
- `POST /api/front/gift/recharge/create` - 创建充值订单
**文档:**
- 详细开发文档`Zhibo/zhibo-h/礼物打赏模块开发说明.md`
- 快速开始指南`Zhibo/zhibo-h/礼物打赏模块快速开始.md`
- 部署清单`Zhibo/礼物打赏模块部署清单.md`
---
### 模块8多媒体消息模块 ✓
**功能**
- 图片上传与发送
- 语音上传与发送
- 视频上传与发送
- 文件存储本地/OSS)✓
- 缩略图生成
**需要实现的类:**
- `UploadController` - 文件上传接口 (UserUploadController)
- `FileStorageService` - 文件存储服务
- `ImageService` - 图片处理压缩缩略图)✓
- `MediaMessageService` - 多媒体消息服务
**处理流程:**
- 客户端先上传文件 返回URL 发送消息时带上URL和元信息
---
### 模块9消息已读回执模块 ✓
**功能**
- 标记消息已读
- 未读消息统计
- 已读状态推送
- 会话未读数更新
**需要实现的类:**
- `ReadReceiptService` - 已读回执服务 (内置在ConversationService中)
- `UnreadCountService` - 未读数统计 (内置在ConversationService中)
**实现逻辑:**
- 用户查看消息 批量更新已读状态 推送已读回执给发送方 更新会话未读数
---
### 模块10好友私聊消息模块 ✅ (已实现)
**功能**
- 好友之间发送文本消息
- 好友之间发送图片消息
- 好友之间发送语音消息
- 好友之间发送视频消息
- 消息已读状态
- 正在输入提示
- 离线消息推送
**已实现的类:**
- `PrivateChatHandler` - 私聊WebSocket处理器
- `ConversationService` - 会话服务
- `ConversationController` - 会话接口
- `OfflineMessageService` - 离线消息服务
**核心功能:**
- 通过WebSocket实现实时消息推送
- 支持多设备同时在线
- 自动保存离线消息
- 消息已读回执
- 正在输入状态同步
**WebSocket路径** `/ws/chat/{conversationId}?userId={userId}`
**消息类型:**
- `chat` - 聊天消息
- `read` - 已读通知
- `typing` - 正在输入
- `new_message` - 新消息通知
---
### 模块11群组聊天模块 ❌ (未实现)
**功能**
- 撤回自己发送的消息2分钟内)❌
- 推送撤回通知
- 更新消息状态
**需要实现的类:**
- `MessageRecallService` - 消息撤回服务
**撤回逻辑:**
- 验证权限和时间 更新消息状态 推送撤回通知 更新会话最后消息
**优先级:** - 非核心功能
---
**功能:**
- 创建群组
- 邀请成员加入群组
- 群组消息发送
- 群组消息广播
- 群组成员管理
- 群主/管理员权限
- 群公告
- @提醒功能
**需要实现的类:**
- `GroupChatHandler` - 群聊WebSocket处理器
- `GroupService` - 群组服务
- `GroupController` - 群组接口
- `GroupMemberService` - 群成员服务
**数据库表:**
- `eb_group` - 群组表
- `eb_group_member` - 群成员表
- `eb_group_message` - 群消息表
**优先级:** - 增强社交互动
**预计工作量:** 4-5天
---
### 模块12消息撤回模块 ❌ (未实现)
**功能**
- 系统通知管理 (后台已实现)
- 点赞通知
- 评论通知
- 关注通知
- @提醒通知
- 系统公告 (基础功能已实现)
**已实现的类:**
- `SystemNotificationController` - 系统通知接口 (后台管理)
- `SystemNotificationService` - 通知业务逻辑
- `SystemNotification` - 通知实体
**待实现:**
- 前端通知推送接口
- 实时推送服务 (WebSocket/FCM)
- 社交互动通知 (点赞评论关注)
**优先级:** - 增强用户体验
---
**功能:**
- 撤回自己发送的消息2分钟内)❌
- 推送撤回通知
- 更新消息状态
**需要实现的类:**
- `MessageRecallService` - 消息撤回服务
**撤回逻辑:**
- 验证权限和时间 更新消息状态 推送撤回通知 更新会话最后消息
**优先级:** - 非核心功能
**预计工作量:** 1-2天
---
### 模块13消息转发模块 ❌ (未实现)
**功能**
- 转发消息给好友
- 转发消息到群组
- 批量转发
- 转发历史记录
**需要实现的类:**
- `MessageForwardService` - 消息转发服务
**优先级:** - 辅助功能
**预计工作量:** 1-2天
---
### 模块14语音/视频通话模块 ❌ (未实现)
**功能**
- 一对一语音通话
- 一对一视频通话
- 通话邀请/接听/拒绝
- 通话记录
- 通话质量监控
**需要实现的类:**
- `CallService` - 通话服务
- `CallController` - 通话接口
- `CallSignalingHandler` - 信令WebSocket处理器
**技术方案:**
- 使用WebRTC实现音视频通话
- 使用WebSocket传输信令
- 可选集成第三方服务声网腾讯云
**优先级:** - 高级功能
**预计工作量:** 5-7天
---
### 模块15消息搜索模块 ❌ (未实现)
**功能**
- 搜索聊天记录
- 按时间范围搜索
- 按消息类型搜索
- 搜索结果高亮
**需要实现的类:**
- `MessageSearchService` - 消息搜索服务
**技术方案:**
- 使用MySQL全文索引
- 或使用Elasticsearch
**优先级:** - 提升用户体验
**预计工作量:** 2-3天
---
### 模块16消息引用/回复模块 ❌ (未实现)
**功能**
- 引用消息回复
- 显示被引用的消息
- 点击引用跳转到原消息
**需要实现的类:**
- 扩展现有的消息模型
**优先级:** - 辅助功能
**预计工作量:** 1-2天
---
### 模块17消息表情回应模块 ❌ (未实现)
**功能**
- 对消息添加表情回应
- 查看谁回应了表情
- 取消表情回应
**需要实现的类:**
- `MessageReactionService` - 消息回应服务
**数据库表:**
- `eb_message_reaction` - 消息回应表
**优先级:** - 增强互动
**预计工作量:** 1-2天
---
### 模块18敏感词过滤模块 ❌ (未实现)
**功能**
- 敏感词库管理
- DFA算法过滤
- 消息内容检测
**需要实现的类:**
- `SensitiveWordFilter` - 敏感词过滤器
- `SensitiveWordService` - 敏感词管理
**过滤策略:**
- 使用DFA算法构建敏感词树
- 消息发送前过滤
- 替换为***或直接拒绝
**优先级:** - 内容安全必需
**建议:** 可先使用第三方内容审核API (如阿里云腾讯云)
---
### 模块19限流防刷模块 ⚠️ (需完善)
**功能**
- 消息发送频率限制 (未实现)
- 接口调用限流 (未实现)
- IP黑名单 (基础功能存在)
- 用户封禁 (基础功能存在)
**需要实现的类:**
- `RateLimiterService` - 限流服务
- `RateLimitInterceptor` - 限流拦截器
- `RateLimitAspect` - 限流切面
**限流策略:**
- 使用Redis + 令牌桶算法
- 弹幕1秒1条
- 私聊1秒3条
- 图片1分钟10张
**优先级:** - 防止恶意刷屏和攻击
**建议:** 使用Redisson的RRateLimiter或Guava的RateLimiter
---
## 三、开发任务清单7天计划
### Day 1基础架构 ✓
- [x] 创建Spring Boot项目
- [x] 配置MySQLRedis连接
- [x] 集成MyBatis-Plus
- [x] 实现JWT认证
- [x] 实现用户注册/登录接口
### Day 2WebSocket核心 ✓
- [x] 配置WebSocket
- [x] 实现连接管理器
- [x] 实现心跳检测 (需完善)
- [x] 实现在线状态管理
- [x] 测试连接建立和断开
### Day 3消息收发 ✅
- [x] 实现单聊消息发送
- [x] 实现消息路由逻辑
- [x] 实现消息存储
- [x] 实现离线消息
- [x] 实现历史消息查询
### Day 4直播间功能 ✓
- [x] 实现进入/离开直播间
- [x] 实现弹幕发送
- [x] 实现弹幕广播
- [x] 实现在线人数统计
- [ ] 实现敏感词过滤
### Day 5社交功能 ✅
- [x] 实现好友申请/处理
- [x] 实现好友列表
- [x] 实现用户搜索
- [x] 实现礼物打赏直播间+私聊)✅
- [x] 实现消息已读回执
- [ ] 实现消息撤回 (非必需)
### Day 6多媒体消息 ✓
- [x] 实现图片上传
- [x] 实现语音上传
- [x] 实现视频上传
- [x] 实现多媒体消息发送
- [ ] 实现通知推送
### Day 7测试优化 ⚠️
- [ ] 功能测试 (进行中)
- [ ] 压力测试 (未开始)
- [ ] 性能优化 (需完善)
- [ ] 部署上线 (需完善)
- [ ] 限流防刷 (待实现)
- [ ] 敏感词过滤 (待实现)
---
## 四、关键技术实现要点
### 1. WebSocket消息格式统一JSON
**客户端发送:**
```json
{
"action": "sendMessage|sendBarrage|enterRoom|leaveRoom|heartbeat",
"data": {
// 具体数据
}
}
```
**服务端推送:**
```json
{
"type": "message|barrage|gift|notification|system",
"data": {
// 具体数据
}
}
```
### 2. Redis数据结构设计单机版
```
在线用户Hash
Key: online:users
Field: userId
Value: {sessionId, connectTime, lastHeartbeat}
TTL: 5分钟心跳更新
直播间在线Set
Key: room:online:{roomId}
Member: userId
TTL: 1小时
用户连接映射String
Key: user:conn:{userId}
Value: sessionId
TTL: 5分钟
离线消息队列List限制长度
Key: offline:msg:{userId}
Value: [完整消息JSON1, 完整消息JSON2, ...]
LTRIM: 保留最新100条
TTL: 7天
消息缓存String (TTL=7天)
Key: msg:{msgId}
Value: JSON消息体
TTL: 7天
会话未读数Hash
Key: conversation:unread:{userId}
Field: conversationId
Value: unreadCount
限流令牌桶String
Key: ratelimit:{type}:{userId}
Value: tokens
TTL: 1秒
用户在线状态String
Key: user:online:{userId}
Value: 1/0
TTL: 5分钟
直播间人数统计String
Key: room:viewers:{roomId}
Value: count
TTL: 1小时
热点数据缓存String
Key: cache:{type}:{id}
Value: JSON数据
TTL: 根据类型设置用户信息1小时直播间列表5分钟
```
### 3. 消息路由核心逻辑(单机版)
```java
// 单聊路由
if (目标用户在线) {
通过WebSocket直接推送
} else {
存入离线消息队列Redis List
发送推送通知可选
}
// 直播间广播
获取房间所有在线用户Redis Set
for (每个用户) {
异步推送消息线程池处理
}
// 消息持久化(异步批量)
消息先放入内存队列LinkedBlockingQueue
定时任务1秒一次批量写入MySQL200条/
写入失败重试3次最终失败记录日志
```
### 4. 性能优化关键点(单台服务器)
**连接优化:**
- 使用Netty替代Spring WebSocket性能提升3-5倍
- 单机支持5-10万连接8核16G配置
- 系统参数优化文件描述符TCP参数
**消息优化:**
- 弹幕限流1秒1条Redis令牌桶
- 批量入库200条/批次异步批量写入
- 启用WebSocket压缩减少50%流量
**存储优化:**
- 消息缓存7天Redis
- 历史消息分页查询MySQL索引优化
- 离线消息限制100条Redis List
- 热点数据缓存本地缓存Caffeine + Redis
**广播优化:**
- 异步推送线程池处理
- 失败重试1次避免阻塞
- 单次超时100ms
- 大直播间分组推送每组500人
**数据库优化:**
- 连接池优化HikariCP
- 索引优化覆盖索引联合索引
- 慢查询优化
- 定期清理历史数据
**缓存优化:**
- 二级缓存Caffeine + Redis
- 热点数据预加载
- 缓存穿透防护布隆过滤器
- 合理设置过期时间
**网络优化:**
- CDN加速图片视频
- 长连接复用
- 心跳包优化30秒一次
- 消息压缩Gzip
---
## 七、WebSocket消息类型
### 客户端发送
**直播间弹幕 (LiveChatHandler):**
- `heartbeat` - 心跳
- `sendBarrage` - 发送弹幕
- `enterRoom` - 进入直播间
- `leaveRoom` - 离开直播间
- `sendGift` - 送礼物
**私聊消息 (PrivateChatHandler):**
- `chat` - 发送聊天消息
- `messageType`: text/image/voice/video
- `read` - 标记已读
- `typing` - 正在输入
**待实现:**
- `recallMessage` - 撤回消息
- `forwardMessage` - 转发消息
- `replyMessage` - 引用回复
### 服务端推送
**直播间消息:**
- `barrage` - 弹幕消息
- `gift` - 礼物消息
- `enterRoom` - 进入房间通知
- `leaveRoom` - 离开房间通知
- `system` - 系统消息
**私聊消息:**
- `chat` - 聊天消息
- `new_message` - 新消息通知
- `read` - 已读回执
- `typing` - 正在输入通知
- `connected` - 连接成功
- `error` - 错误消息
**待实现:**
- `recall` - 撤回通知
- `forward` - 转发通知
- `call_invite` - 通话邀请
- `call_accept` - 通话接听
- `call_reject` - 通话拒绝
---
## 八、部署配置(单台服务器优化版)
### 服务器配置建议
**推荐配置支持5-10万用户**
- CPU8核或16核
- 内存16G或32G
- 硬盘SSD 500G
- 带宽20M或更高
- 系统CentOS 7.9 / Ubuntu 20.04
- 软件JDK 11+、MySQL 8.0Redis 6.0Nginx
**最低配置支持3-5万用户**
- CPU4核
- 内存8G
- 硬盘SSD 200G
- 带宽10M
- 系统CentOS 7.9 / Ubuntu 20.04
**成本估算:** 约500-1500元/云服务器
### 应用配置(生产环境)
```yaml
server:
port: 8080
tomcat:
threads:
max: 300
min-spare: 50
max-connections: 10000
accept-count: 500
spring:
# MySQL配置
datasource:
url: jdbc:mysql://localhost:3306/im_system?useSSL=false&serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8
username: root
password: your_password
hikari:
maximum-pool-size: 50
minimum-idle: 10
connection-timeout: 30000
idle-timeout: 600000
max-lifetime: 1800000
# Redis配置
redis:
host: localhost
port: 6379
password: your_redis_password
database: 0
lettuce:
pool:
max-active: 100
max-idle: 20
min-idle: 5
max-wait: 3000
timeout: 3000
jwt:
secret: your-secret-key-change-in-production-min-32-chars
expiration: 604800000 # 7天
# WebSocket配置使用Netty
netty:
websocket:
port: 9090
boss-threads: 1
worker-threads: 8
max-frame-size: 65536
heartbeat-interval: 30000 # 30秒
heartbeat-timeout: 90000 # 90秒
max-connections: 100000 # 最大连接数
# 消息配置
message:
batch-size: 200 # 批量入库大小
batch-timeout: 1000 # 批量超时时间(ms)
# 限流配置
rate-limit:
barrage:
rate: 1 # 弹幕1条/秒
capacity: 5 # 令牌桶容量
private-message:
rate: 3 # 私聊3条/秒
capacity: 10
image-upload:
rate: 10 # 图片10张/分钟
capacity: 20
# 文件上传配置
upload:
path: /data/upload
max-size: 10485760 # 10MB
image-max-size: 5242880 # 5MB
video-max-size: 104857600 # 100MB
# 缓存配置
cache:
caffeine:
user-info:
max-size: 10000
expire-after-write: 3600 # 1小时
room-info:
max-size: 5000
expire-after-write: 300 # 5分钟
```
### 系统优化配置
**1. Linux系统参数优化/etc/sysctl.conf**
```bash
# 增加文件描述符限制
fs.file-max = 1000000
# TCP优化
net.ipv4.tcp_max_syn_backlog = 8192
net.core.somaxconn = 8192
net.core.netdev_max_backlog = 8192
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 30
# 应用后执行
sysctl -p
```
**2. 用户限制优化(/etc/security/limits.conf**
```bash
* soft nofile 100000
* hard nofile 100000
* soft nproc 100000
* hard nproc 100000
```
**3. MySQL优化my.cnf**
```ini
[mysqld]
# 连接数
max_connections = 500
# 缓冲池大小建议设置为内存的50-70%
innodb_buffer_pool_size = 8G
# 日志文件大小
innodb_log_file_size = 512M
# 查询缓存
query_cache_size = 128M
query_cache_type = 1
# 慢查询日志
slow_query_log = 1
long_query_time = 2
```
**4. Redis优化redis.conf**
```ini
# 最大内存建议设置为物理内存的50%
maxmemory 8gb
# 淘汰策略
maxmemory-policy allkeys-lru
# 持久化(根据需求选择)
save 900 1
save 300 10
save 60 10000
# AOF持久化可选
appendonly yes
appendfsync everysec
```
### Nginx配置WebSocket代理
```nginx
upstream websocket_backend {
server 127.0.0.1:9090;
}
upstream http_backend {
server 127.0.0.1:8080;
}
server {
listen 80;
server_name yourdomain.com;
# WebSocket代理
location /ws/ {
proxy_pass http://websocket_backend;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 60s;
proxy_send_timeout 300s;
proxy_read_timeout 300s;
}
# HTTP API代理
location /api/ {
proxy_pass http://http_backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 10s;
proxy_send_timeout 30s;
proxy_read_timeout 30s;
}
# 静态文件
location /upload/ {
alias /data/upload/;
expires 30d;
}
}
```
---
## 九、测试要点(单台服务器)
### 功能测试
- [ ] 用户登录注册
- [ ] WebSocket连接建立
- [ ] 单聊消息收发
- [ ] 直播间弹幕
- [ ] 好友申请处理
- [ ] 礼物打赏
- [ ] 图片/语音消息
- [ ] 消息已读
- [ ] 消息撤回
- [ ] 离线消息
### 性能测试使用JMeter/Gatling
**1. 连接压测**
- [ ] 连接数5000目标达成
- [ ] 连接数10000目标达成
- [ ] 连接数50000挑战目标
- [ ] 连接建立速度500连接/
- [ ] 连接稳定性24小时不断线
**2. 消息吞吐量测试**
- [ ] 吞吐量1000条/
- [ ] 吞吐量3000条/
- [ ] 吞吐量5000条/目标
- [ ] 弹幕广播延迟P99 < 200ms
- [ ] 私聊消息延迟P99 < 100ms
**3. 接口性能测试**
- [ ] 登录接口QPS 500+响应时间 < 50ms
- [ ] 消息列表QPS 1000+响应时间 < 100ms
- [ ] 好友列表QPS 800+响应时间 < 80ms
- [ ] 直播间列表QPS 1500+响应时间 < 100ms
**4. 数据库压测**
- [ ] MySQL读QPS2000+
- [ ] MySQL写QPS1000+
- [ ] Redis读QPS10000+
- [ ] Redis写QPS5000+
**5. 稳定性测试**
- [ ] 24小时压测
- [ ] 内存泄漏检测
- [ ] CPU使用率 < 70%
- [ ] 内存使用率 < 80%
### 压测工具推荐
- **JMeter**: HTTP接口压测
- **Gatling**: WebSocket压测
- **wrk**: 轻量级HTTP压测
---
## 十、常见问题处理(单台服务器)
### 1. 消息丢失怎么办?
- 实现消息ACK确认机制客户端确认收到
- 离线消息队列保底Redis List
- 客户端重发机制3次重试
- 数据库最终一致性异步入库
### 2. 直播间消息风暴?
- 消息限流1秒1条Redis令牌桶
- 超过阈值丢弃保护服务器
- 降级策略高峰期只推送重要消息
- 大直播间分组推送每组500人
### 3. 单机性能瓶颈?
- 优化代码减少不必要的计算
- 使用Netty替代Spring WebSocket
- 启用本地缓存Caffeine
- 数据库连接池优化
- Redis连接池优化
- 考虑升级服务器配置
### 4. 如何保证消息顺序?
- 单聊按时间戳排序客户端排序
- 直播间不保证严格顺序可接受
- 重要消息使用消息ID递增数据库自增ID
### 5. WebSocket连接频繁断开
- 增加心跳间隔30秒
- 客户端自动重连指数退避
- Nginx超时时间调整300秒
- 检查网络质量弱网优化
### 6. Redis内存不足
- 设置过期时间消息7天过期
- 淘汰策略LRU
- 定期清理冷数据
- 考虑增加内存
### 7. MySQL慢查询
- 添加索引覆盖索引联合索引
- 优化SQL语句
- 分页查询避免全表扫描
- 缓存热点数据Redis
### 8. 如何监控系统健康?
- 日志监控查看错误日志
- 性能监控CPU内存网络
- 连接数监控WebSocket连接数
- 慢查询监控MySQL慢查询日志
### 9. 成本优化建议
- 使用云服务器按量付费
- CDN加速减少带宽成本
- 数据压缩减少存储成本
- 冷数据归档对象存储
---
---
## 十一、扩展性设计(未来扩展到更大规模)
如果未来需要支持10万+甚至50万用户可以考虑以下升级方案
### 1. 集群部署
- 多台WebSocket服务器3-5台
- Nginx负载均衡IP Hash策略
- 使用RabbitMQ实现跨服务器消息转发
### 2. 数据库优化
- MySQL读写分离1主2从
- 分库分表按用户ID取模
- 使用分布式数据库TiDB
### 3. 缓存优化
- Redis Cluster3主3从
- 本地缓存+Redis二级缓存
- 缓存预热
### 4. 监控告警
- Prometheus + Grafana
- ELK日志分析
- 实时告警系统
---
**文档版本:** v3.0
**适用对象:** Java后端开发者
**开发周期:** 2周含测试优化
**用户规模:** 5-10万单台服务器
---
## 📊 开发进度总结
### 已完成模块 ✅
1. **用户认证模块**
- 登录注册验证码功能完整
- JWT Token生成与验证
- Token刷新机制
2. **用户资料模块**
- 用户信息管理头像上传
- 个人资料修改
- 手机号换绑
3. **直播间模块**
- 直播间列表详情创建删除
- SRS推流回调集成
- 直播间在线人数统计
4. **消息聊天模块**
- 私信会话列表消息发送接收
- WebSocket实时通信
- 会话搜索功能
- 消息已读状态
5. **直播间弹幕模块**
- 弹幕发送接收广播
- WebSocket实时推送
- 进入/离开房间通知
6. **多媒体消息模块**
- 图片语音视频上传
- 文件存储服务 (本地/OSS/COS/七牛云)
- 图片压缩和缩略图
7. **礼物打赏模块**
- 礼物列表管理
- 礼物赠送功能完整事务处理
- 用户余额管理
- 充值选项配置
- 账单记录生成
- 支持直播间和私聊场景
8. **在线状态模块**
- 用户在线状态管理
- 心跳检测机制 (30秒间隔)
- 超时自动断开 (90秒)
9. **离线消息模块**
- 离线消息存储 (Redis + MySQL)
- 消息推送机制
- 离线消息拉取
10. **好友关系模块**
- 用户搜索功能
- 好友申请/处理
- 好友列表查询
- 删除好友
- 好友在线状态
11. **好友私聊消息模块**
- 好友之间实时消息
- 多媒体消息支持
- 消息已读状态
- 正在输入提示
- 离线消息推送
- 用户搜索功能
- 好友申请/处理
- 好友列表查询
- 删除好友
- 好友在线状态
### 待完成的IM通信模块 ❌
1. **群组聊天模块** (未实现)
- 创建群组邀请成员
- 群组消息发送与广播
- 群组成员管理
- 群主/管理员权限
- **优先级**
- **预计工作量** 4-5天
2. **消息撤回模块** (未实现)
- 撤回消息2分钟内)❌
- 推送撤回通知
- **优先级**
- **预计工作量** 1-2天
3. **消息转发模块** (未实现)
- 转发消息给好友/群组
- 批量转发
- **优先级**
- **预计工作量** 1-2天
4. **语音/视频通话模块** (未实现)
- 一对一语音/视频通话
- 通话邀请/接听/拒绝
- 通话记录
- **优先级**
- **预计工作量** 5-7天
- **技术方案** WebRTC或第三方SDK
5. **消息搜索模块** (未实现)
- 搜索聊天记录
- 按时间/类型搜索
- **优先级**
- **预计工作量** 2-3天
6. **消息引用/回复模块** (未实现)
- 引用消息回复
- 跳转到原消息
- **优先级**
- **预计工作量** 1-2天
7. **消息表情回应模块** (未实现)
- 对消息添加表情回应
- 查看回应列表
- **优先级**
- **预计工作量** 1-2天
### 待完成的业务功能模块 ❌
8. **作品管理模块** (未实现)
- 作品发布编辑删除
- 作品列表查询
- 作品点赞收藏
- **优先级**
- **预计工作量** 3-4天
9. **评论功能模块** (未实现)
- 评论发布回复
- 评论列表查询
- 评论点赞
- **优先级**
- **预计工作量** 2-3天
- **注意** 商品评论已实现但作品评论未实现
10. **社交功能模块** (部分实现)
- 关注/取消关注
- 粉丝列表
- 关注列表
- 好友管理 (已完成)
- **优先级**
- **预计工作量** 2-3天
11. **搜索功能模块** (部分实现)
- 用户搜索 (已完成)
- 直播间搜索
- 作品搜索
- 搜索历史
- 热门搜索
- **优先级**
- **预计工作量** 2-3天
12. **分类管理模块** (基础功能存在)
- 分类列表 (商品分类已实现)
- 直播间分类
- 作品分类
- 分类筛选
- **优先级**
- **预计工作量** 1-2天
13. **通知推送模块** (部分实现)
- 系统通知 (后台管理已实现)
- 前端通知接口
- 实时推送 (WebSocket)
- FCM集成
- 推送历史
- **优先级**
- **预计工作量** 3-4天
14. **支付集成模块** (部分实现)
- 微信支付 (已实现)
- 支付宝支付
- 充值功能 (已实现)
- 支付回调处理 (已实现)
- 礼物充值 (已实现)
- **优先级** (礼物打赏需要)
- **预计工作量** 2-3天 (仅支付宝)
15. **限流防刷模块** (未实现)
- 消息发送频率限制
- 接口调用限流
- 防刷机制
- **优先级**
- **预计工作量** 2-3天
16. **敏感词过滤模块** (未实现)
- 敏感词库管理
- 内容过滤
- **优先级**
- **预计工作量** 2-3天
### 完成度统计
- **已完成模块**: 11个
- **部分完成模块**: 4个
- **未完成IM通信模块**: 7个
- **未完成业务功能模块**: 9个
- **总体完成度**: 55%
**IM核心功能完成度**: 75%
- 一对一私聊
- 直播间弹幕
- 离线消息
- 群组聊天
- 语音/视频通话
**业务功能完成度**: 60%
### 核心功能完成度
- **直播核心功能**: 95%
- 直播间管理
- 弹幕系统
- 礼物打赏
- 推流集成
- 在线人数统计
- **缺失**: 限流防刷
- **社交功能**: 70%
- 私信聊天
- 在线状态
- 好友管理
- 用户搜索
- 关注功能
- 评论功能
- **用户系统**: 90%
- 认证登录
- 资料管理
- 余额管理
- 账单记录
- 充值功能
- **缺失**: 支付宝支付
- **内容管理**: 35%
- 多媒体上传
- 作品管理
- 分类管理 (商品分类已实现)
- 搜索功能 (用户搜索已实现)
- **安全防护**: 20%
- 限流防刷
- 敏感词过滤
- IP黑名单
- 用户封禁
### 最新更新
**2024年12月25日 - 系统功能完成度分析**
**已完成的核心功能:**
- 用户认证与资料管理 (90%)
- 直播间管理与弹幕系统 (95%)
- 私信聊天与会话管理 (100%)
- 好友关系管理 (100%)
- 礼物打赏系统 (100%)
- 多媒体消息 (100%)
- 在线状态与心跳检测 (100%)
- 离线消息处理 (100%)
- WebSocket实时通信 (100%)
**待完成的重要功能:**
- 限流防刷机制 (0%) - **高优先级**
- 敏感词过滤 (0%) - **高优先级**
- 关注/粉丝功能 (0%) - **高优先级**
- 作品管理 (0%) - **中优先级**
- 评论功能 (0%) - **中优先级**
- 搜索功能 (30%) - **中优先级**
- 通知推送 (20%) - **中优先级**
**技术债务:**
- 需要添加限流防刷机制保护系统
- 需要实现敏感词过滤保证内容安全
- 需要完善错误处理和日志记录
- 需要进行性能测试和优化
### 下一步开发计划
**第一阶段IM核心功能完善 (2-3周) - 高优先级**
1. **群组聊天模块**
- 创建群组邀请成员
- 群组消息发送与广播
- 群组成员管理
- 群主/管理员权限
- **预计工作量**: 4-5天
2. **消息搜索模块**
- 搜索聊天记录
- 按时间/类型搜索
- **预计工作量**: 2-3天
3. **消息撤回模块**
- 撤回消息2分钟内
- 推送撤回通知
- **预计工作量**: 1-2天
**第二阶段:安全与稳定性 (1-2周) - 高优先级**
4. **限流防刷机制**
- 实现消息发送频率限制
- 实现接口调用限流
- 防止恶意刷屏和攻击
- **预计工作量**: 2-3天
5. **敏感词过滤**
- 实现敏感词库管理
- 实现内容过滤机制
- 保证内容安全
- **预计工作量**: 2-3天
6. **性能测试与优化**
- 压力测试
- 性能瓶颈分析
- 数据库优化
- **预计工作量**: 3-5天
**第三阶段:社交功能完善 (1-2周) - 高优先级**
7. **关注/粉丝功能**
- 关注/取消关注
- 粉丝列表
- 关注列表
- **预计工作量**: 2-3天
8. **支付宝支付集成**
- 支付宝SDK集成
- 支付回调处理
- **预计工作量**: 2-3天
**第四阶段:内容管理 (2-3周) - 中优先级**
9. **作品管理模块**
- 作品发布编辑删除
- 作品列表查询
- 作品点赞收藏
- **预计工作量**: 3-4天
10. **评论功能模块**
- 评论发布回复
- 评论列表查询
- 评论点赞
- **预计工作量**: 2-3天
11. **搜索功能完善**
- 直播间搜索
- 作品搜索
- 搜索历史
- 热门搜索
- **预计工作量**: 2-3天
**第五阶段:辅助功能 (2-3周) - 低优先级**
12. **通知推送完善**
- 前端通知接口
- 实时推送 (WebSocket)
- FCM集成
- **预计工作量**: 3-4天
13. **分类管理**
- 直播间分类
- 作品分类
- 分类筛选
- **预计工作量**: 1-2天
14. **消息转发模块**
- 转发消息给好友/群组
- **预计工作量** 1-2天
15. **消息引用/回复模块**
- 引用消息回复
- **预计工作量** 1-2天
16. **消息表情回应模块**
- 对消息添加表情回应
- **预计工作量** 1-2天
17. **语音/视频通话模块** (可选)
- 一对一语音/视频通话
- **预计工作量** 5-7天
- **技术方案** WebRTC或第三方SDK
**总预计开发时间**: 8-12周
---
## 📊 项目状态总结
### 可以投入使用的IM功能 ✅
- 用户注册登录
- 直播间管理与观看
- 实时弹幕聊天
- **好友一对一私聊** (文本/图片/语音/视频)
- 好友管理
- 礼物打赏
- 多媒体消息
- 在线状态
- 消息已读状态
- 正在输入提示
- 离线消息推送
### 需要补充的IM功能 ⚠️
- **群组聊天** - 多人聊天场景
- **消息搜索** - 查找历史消息
- **消息撤回** - 撤回错误消息
- **限流防刷** - 防止恶意攻击
- **敏感词过滤** - 内容安全
### 可选的高级IM功能 (低优先级)
- 消息转发
- 消息引用/回复
- 消息表情回应
- 语音/视频通话
### 建议开发顺序
1. **优先完善IM核心功能**群组聊天消息搜索消息撤回
2. **然后完善安全防护**限流敏感词
3. **再进行性能测试和优化**
4. **接着开发社交功能**关注评论
5. **最后完善辅助功能**搜索通知高级IM功能
---
**最后更新时间**: 2024年12月25日
**当前版本**: v1.0
**维护状态**: 🟢 活跃开发中
**核心功能完成度**: 85%
**整体完成度**: 65%