You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
wx.sstbc.com/doc/线上课程平台功能设计与承载量评估.md

267 lines
17 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 线上课程平台功能设计与承载量评估
## 一、需求概述与目标
**核心需求**:为客户建设一套可用的线上课程平台,支持课程发布、学习管理、直播/录播、互动与数据统计,并能在预期用户规模下稳定运行。
**目标**
- **功能完整**:覆盖课程生命周期、学习行为、互动与运营统计
- **可落地**:技术方案与现有技术栈兼容,便于实施与迭代
- **可评估**:对并发、带宽、存储等承载量有清晰估算与扩展路径
---
## 二、功能模块设计
### 2.1 功能总览
| 模块 | 功能要点 | 优先级 |
|------|----------|--------|
| 课程管理 | 课程/章节/课时创建、上下架、排序、分类与标签 | P0 |
| 学习进度 | 报名、学习记录、进度同步、完成规则(按课时/按章节) | P0 |
| 视频能力 | 录播点播上传、转码、CDN 分发)、倍速/拖拽 | P0 |
| 直播能力 | 创建直播、推流/拉流、回放生成、签到/互动(可选) | P1 |
| 练习与考试 | 练习题/试卷、答题记录、自动批改、成绩与错题本 | P1 |
| 互动 | 评论/问答、笔记、讨论区、弹幕(可选) | P1 |
| 运营与统计 | 学习报表、完课率、热门课程、行为分析、导出 | P0 |
### 2.2 核心业务流程
```
[管理员] 创建课程 → 添加章节/课时 → 上传视频或配置直播
[学员] 选课/报名 → 按章节学习 → 观看视频/直播 → 做题/考试 → 获得完成凭证
[系统] 记录学习进度、行为日志 → 统计报表、完课率、热门分析
```
---
## 三、使用第三方平台的方案
除自建系统外,可选用**第三方线上课程/知识付费平台**,由平台提供课程、视频、直播、练习、统计等能力,客户在平台内创建课程、招募学员即可,无需自建服务器与开发业务系统。
### 3.1 典型第三方平台(示例)
| 类型 | 代表产品 | 能力概览 | 适用场景 |
|------|----------|----------|----------|
| 综合型知识付费/网校 | **小鹅通**、**有赞教育**、**千聊** | 课程/专栏、录播/直播、打卡、考试、分销、数据统计 | 培训、知识付费、企业内训 |
| 云课堂/公开课 | **腾讯课堂**、**网易云课堂**、**慕课网** | 课程体系、视频、直播、作业/考试、证书、学习数据 | 公开招生、职业技能培训 |
| 会议/互动教室 | **ClassIn**、**腾讯会议**、**钉钉**(云课堂/在线课堂) | 实时互动、直播授课、白板、录播回放、考勤与数据 | 强互动、小班课、会议式授课 |
| 企业学习平台 | **云学堂**、**魔学院**、**问鼎** | 学习计划、必修/选修、考试、证书、报表、与 OA/HR 对接 | 企业内训、合规学习、人才发展 |
以上仅为示例,选型时需以当前产品能力、报价与客户业务匹配度为准。
### 3.2 第三方方案的优势与约束
| 维度 | 说明 |
|------|------|
| **上线快** | 注册/开通即可创建课程、上传视频、开直播,无需开发与部署,几天内可对外开课 |
| **无基础设施负担** | 带宽、转码、存储、并发由平台承担,无需自建 CDN、流媒体与承载量评估 |
| **功能现成** | 报名、学习进度、打卡、考试、证书、报表等一般已具备,按需开通与配置 |
| **成本结构** | 多为按年/按人数/按流量付费,初期投入低;规模大时需看阶梯价格与定制费用 |
| **定制与集成** | 界面、流程、业务规则受平台限制;与自有系统(如 CRM、公众号、支付集成需看是否提供 API/ webhook/ 嵌入能力 |
| **数据与合规** | 学习数据在平台侧,需确认导出能力、留存周期及是否满足客户的数据主权与合规要求 |
### 3.3 选型建议
- **适合优先考虑第三方平台的场景**:希望快速上线、团队无研发/运维资源、以标准课程+直播+简单练习为主、对深度定制与系统对接要求不高。
- **适合自建的场景**:需与现有业务系统深度打通、有强定制与品牌统一要求、对数据与合规有明确自管要求、或长期规模与成本测算后自建更优。
- **混合方式**:核心授课与学习在第三方完成,通过 API/ 嵌入/ 单点登录与自有系统做账号与门户统一、订单与数据回传,形成「第三方授课 + 自建门户/运营」的折中方案。
若选择**自建**,则采用下文**第四、五、六节**的技术方案、承载量评估与实施建议;若选择**第三方或混合**,可仅将第四~六节作为技术参考或对接设计依据。
---
## 四、技术方案与实现要点(自建方案)
### 4.1 整体架构建议
```
┌─────────────────────────────────────────┐
│ 用户端Web / 小程序 / H5
└───────────────────┬─────────────────────┘
┌───────────────────▼─────────────────────┐
│ API 网关 / 负载均衡 │
└───────────────────┬─────────────────────┘
┌───────────────┬───────────────┼───────────────┬───────────────┐
▼ ▼ ▼ ▼ ▼
[业务服务] [点播/直播] [文件/转码] [搜索/统计] [消息/通知]
│ │ │ │ │
└───────────────┴───────┬───────┴───────────────┴───────────────┘
┌─────────────────────────────────────────┐
│ MySQL / Redis / 对象存储 / 流媒体 │
└─────────────────────────────────────────┘
```
- **业务服务**:课程、报名、进度、练习、考试、互动等,可用现有 Laravel 等框架扩展。
- **点播/直播**:建议对接成熟云厂商(阿里云、腾讯云、七牛等)的「视频点播 + 直播」产品,自建成本高、运维重。
- **文件/转码**:视频上传至对象存储,转码与多清晰度由云点播完成;仅元数据与播放地址自管。
- **搜索/统计**:列表与简单检索用 DB若需全文/复杂筛选可引入 Elasticsearch可选
### 4.2 数据库设计要点
#### 4.2.1 课程与内容
| 表名 | 主要字段 | 说明 |
|------|----------|------|
| `courses` | id, title, cover, intro, category_id, tags, status, sort, created_at | 课程主表 |
| `course_chapters` | id, course_id, title, sort | 章节 |
| `course_lessons` | id, chapter_id, title, type(video/live/text), duration, video_id, live_id, sort | 课时type 区分录播/直播/图文 |
| `course_videos` | id, file_path, cover, duration, transcoded(多清晰度信息 JSON) | 视频元数据,实际文件在对象存储/点播 |
| `course_lives` | id, title, start_at, end_at, stream_name, replay_video_id, status | 直播场次及回放关联 |
#### 4.2.2 学习与进度
| 表名 | 主要字段 | 说明 |
|------|----------|------|
| `course_enrollments` | id, user_id, course_id, enrolled_at, status | 选课/报名 |
| `lesson_progress` | id, user_id, lesson_id, progress_seconds, completed_at, status | 课时学习进度(可细化到秒) |
| `course_progress` | user_id, course_id, completed_lessons_count, finished_at | 课程维度进度汇总(可冗余或统计得出) |
**完成规则**:可在 `courses` 增加 `completion_rule`(如:需完成 80% 课时 / 全部必修课时),在 `lesson_progress``course_progress` 上计算是否达标。
#### 4.2.3 练习与考试
| 表名 | 主要字段 | 说明 |
|------|----------|------|
| `course_exams` | id, course_id, title, type(practice/exam), total_score, pass_score, time_limit_minutes | 练习/试卷定义 |
| `exam_questions` | id, exam_id, type(single/multi/judge/text), content, options, answer, score | 题目 |
| `exam_attempts` | id, user_id, exam_id, started_at, submitted_at, score, passed, answers_snapshot | 作答记录 |
| `exam_attempt_answers` | attempt_id, question_id, user_answer, is_correct, score | 每题作答明细(错题本来源) |
#### 4.2.4 互动与运营
| 表名 | 主要字段 | 说明 |
|------|----------|------|
| `lesson_comments` | id, lesson_id, user_id, content, parent_id, created_at | 评论/问答(可带 parent 做楼中楼) |
| `lesson_notes` | id, user_id, lesson_id, content, video_timestamp_seconds | 笔记(可关联时间点) |
| `learning_logs` | id, user_id, lesson_id, event(play/pause/complete), progress_seconds, created_at | 行为日志(用于统计与报表) |
索引建议:`lesson_progress(user_id, lesson_id)` 唯一;`learning_logs(user_id, created_at)`、`(lesson_id, created_at)``course_enrollments(user_id, course_id)` 唯一。
### 4.3 关键接口与实现要点
| 能力 | 接口/实现方式 | 要点 |
|------|----------------|------|
| 课程列表/详情 | GET /api/courses, GET /api/courses/{id} | 分页、分类/标签筛选、只返回上架课程 |
| 章节与课时树 | GET /api/courses/{id}/chapters | 一次返回章节+课时树,前端按需展示 |
| 报名 | POST /api/courses/{id}/enroll | 幂等;校验是否已报名、课程是否可报名 |
| 进度上报 | POST /api/lessons/{id}/progress | body: progress_seconds, completed防刷如单次上报跨度不超过总时长 |
| 进度查询 | GET /api/courses/{id}/my-progress | 当前用户该课程下各课时进度与完成状态 |
| 视频播放地址 | GET /api/lessons/{id}/play-info | 返回带签名的点播 URL 或 HLS 地址(由云点播生成,避免盗链) |
| 直播地址 | GET /api/lives/{id}/stream-info | 返回推流/拉流地址与鉴权参数 |
| 练习/考试 | GET/POST /api/exams/{id}/attempt, POST submit | 计时在服务端校验;交卷后算分、写 attempt 与 answers |
| 评论/笔记 | CRUD /api/lessons/{id}/comments, /notes | 分页、敏感词过滤(可选) |
| 学习报表 | GET /api/admin/stats/learning | 按课程/时间维度:报名数、完课率、学习时长分布等 |
**视频与直播**:不推荐自建转码与流媒体;使用云点播/直播的 API 完成「上传 → 转码 → 获取播放/推拉流地址」,平台只存 `course_videos`、`course_lives` 与对应 `video_id`/`stream_name`。
---
## 五、承载量评估
### 5.1 评估假设(需按客户实际修正)
| 指标 | 假设值 | 说明 |
|------|--------|------|
| 注册/日活用户 | 5,000 / 2,000 | 日活为估算并发与带宽的基准 |
| 同时在线学习 | 500 | 同一时刻在看视频/直播的人数上界 |
| 峰值系数 | 23× | 活动日/开课日相对平日 |
| 单课程并发观看 | 200 | 单一直播或单课同时观看上限假设 |
| 视频码率 | 12 Mbps | 标清~高清,按 1.5 Mbps 估算 |
| 人均学习时长 | 30 min/日 | 用于估算存储与日志量 |
以下计算均基于上述假设,实际需替换为客户真实或目标数据。
### 5.2 并发与 QPS
| 场景 | 估算方式 | 结果(示例) |
|------|----------|--------------|
| 列表/详情/进度查询 | 日活 × 5 次/天,按 8 小时摊 | 约 1,250 req/h → 0.35 req/s取整 **5 QPS** 可留余量 |
| 进度上报 | 同时在线 × 每 30 s 一次 | 500 × (1/30) ≈ **17 QPS** |
| 评论/笔记/提交试卷 | 按同时在线 10% 有写操作 | 50 × 0.5 次/min ≈ **1 QPS** |
| **业务 API 合计** | 留 23 倍余量 | **5080 QPS** 可覆盖当前假设 |
若日活或同时在线提升,可按比例放大;单机 LaravelPHP-FPM在简单接口下通常可支撑数百 QPS瓶颈多在 DB 与外部服务。
### 5.3 视频带宽(关键)
- **点播**:同时观看 500 人 × 1.5 Mbps ≈ **750 Mbps** 下行(约 94 MB/s
- **直播**:单场 200 人 × 1.5 Mbps ≈ **300 Mbps** 下行。
建议全部走 **CDN + 云点播/直播**,带宽由云厂商按量计费,平台侧不直接出带宽;需在评估报告中写清「预计峰值带宽约 750 Mbps点播+ 300 Mbps直播单场便于客户与云厂商选型与计费。
### 5.4 存储估算
| 类型 | 估算方式 | 结果(示例) |
|------|----------|--------------|
| 视频文件 | 不落本地,在对象存储/点播;仅元数据在 DB | 按课程数量与时长估云侧费用 |
| 数据库 | 用户/课程/进度/答题/日志,按 1 万用户、100 课程、每人 50 条进度 | 约 **15 GB** 量级,随日志与行为表增长 |
| 行为/学习日志 | 2000 日活 × 30 条/天 × 0.5 KB | 约 **30 MB/天**,可定期归档或冷热分离 |
| Redis | 会话、进度缓存、限流 | **12 GB** 足够 |
### 5.5 压测与容量建议
- **业务 API**:对「课程列表、进度上报、我的进度」等接口做压测,目标 **80 QPS 下 P99 < 500 ms**;数据库加索引、避免 N+1。
- **视频**:使用云点播/直播后,由云厂商保证可用性与带宽扩展,平台侧重点保证「获取播放地址」接口稳定与鉴权正确。
- **扩展**
- 应用:单机可先支撑上述量级;超过可加机器 + 负载均衡,会话与缓存用 Redis 集中。
- 数据库:主从读写分离、慢查询优化;日志表可按时分区或归档。
- 带宽与转码:随量在云上扩容,无需自建。
### 5.6 承载量结论表(示例)
| 维度 | 当前假设下容量 | 扩展方式 |
|------|----------------|----------|
| 业务 API | 5080 QPSP99 < 500 ms | 增加应用节点、DB 优化/读写分离 |
| 同时在线学习 | 约 500点播+ 单场 200直播 | 视频全部走 CDN/云服务,按量扩容 |
| 存储DB | 15 GB30 MB/天日志 | 分区/归档、冷热分离 |
| 预期可支撑 | 约 5,000 注册、2,000 日活、500 同时学习 | 按客户目标替换假设后重算 |
---
## 六、实施建议与风险
### 6.1 实施阶段建议
| 阶段 | 内容 | 周期参考 |
|------|------|----------|
| 一期 | 课程管理、录播点播、学习进度、基础报表;对接云点播 | 46 周 |
| 二期 | 直播、练习/考试、评论与笔记 | 34 周 |
| 三期 | 运营报表增强、错题本、消息通知、体验优化 | 23 周 |
先保证「能上课、能记进度、能看数据」,再上直播与练习,可控制风险与返工。
### 6.2 风险与应对
| 风险 | 应对 |
|------|------|
| 视频带宽/成本超预期 | 明确用 CDN + 云点播/直播,按量计费;设置清晰度与码率策略 |
| 进度与完成规则复杂 | 先实现「按课时完成比例」的简单规则,再迭代条件(如必须做完练习) |
| 高并发下 DB 成为瓶颈 | 索引优化、读写分离、热点表(如 progress可考虑分表或缓存 |
| 直播延迟与稳定性 | 完全依赖云直播方案,选成熟厂商并做单场压测与回放验证 |
### 6.3 与客户对焦事项
- **用户规模**:确认日活、同时在线、单课程最大并发,用于替换 4.1 的假设并重算承载量。
- **完成规则**:是否必须做题、是否必须看完全部视频、是否有证书/学分。
- **直播需求**:是否必须、场次频率、是否需要连麦/白板等,以决定是否采用「云直播 + 回放」即可。
- **合规与版权**:课程版权、个人信息与学习数据留存策略、审计日志要求。
---
## 七、文档与交付物建议
- **功能规格**:在本文第二、四节基础上细化成「课程管理」「学习进度」「视频/直播」「练习考试」「统计报表」等子规格,便于开发与验收。
- **承载量报告**:将 5.1 的假设改为客户确认数据后,重新计算 5.25.5,输出一页「承载量评估结论表」和「扩展建议」,便于运维与采购。
- **接口文档**:对 4.3 中接口出 OpenAPI/Swagger便于前后端联调与测试。
---
**文档版本**v1.0
**适用场景**:线上课程平台客户需求的技术实现方案与承载量评估,可作为投标/立项文档的附录或正文依据。