|
|
# 线上课程平台功能设计与承载量评估
|
|
|
|
|
|
## 一、需求概述与目标
|
|
|
|
|
|
**核心需求**:为客户建设一套可用的线上课程平台,支持课程发布、学习管理、直播/录播、互动与数据统计,并能在预期用户规模下稳定运行。
|
|
|
|
|
|
**目标**:
|
|
|
- **功能完整**:覆盖课程生命周期、学习行为、互动与运营统计
|
|
|
- **可落地**:技术方案与现有技术栈兼容,便于实施与迭代
|
|
|
- **可评估**:对并发、带宽、存储等承载量有清晰估算与扩展路径
|
|
|
|
|
|
---
|
|
|
|
|
|
## 二、功能模块设计
|
|
|
|
|
|
### 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 | 同一时刻在看视频/直播的人数上界 |
|
|
|
| 峰值系数 | 2~3× | 活动日/开课日相对平日 |
|
|
|
| 单课程并发观看 | 200 | 单一直播或单课同时观看上限假设 |
|
|
|
| 视频码率 | 1~2 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 合计** | 留 2~3 倍余量 | **50~80 QPS** 可覆盖当前假设 |
|
|
|
|
|
|
若日活或同时在线提升,可按比例放大;单机 Laravel(PHP-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 条进度 | 约 **1~5 GB** 量级,随日志与行为表增长 |
|
|
|
| 行为/学习日志 | 2000 日活 × 30 条/天 × 0.5 KB | 约 **30 MB/天**,可定期归档或冷热分离 |
|
|
|
| Redis | 会话、进度缓存、限流 | **1~2 GB** 足够 |
|
|
|
|
|
|
### 5.5 压测与容量建议
|
|
|
|
|
|
- **业务 API**:对「课程列表、进度上报、我的进度」等接口做压测,目标 **80 QPS 下 P99 < 500 ms**;数据库加索引、避免 N+1。
|
|
|
- **视频**:使用云点播/直播后,由云厂商保证可用性与带宽扩展,平台侧重点保证「获取播放地址」接口稳定与鉴权正确。
|
|
|
- **扩展**:
|
|
|
- 应用:单机可先支撑上述量级;超过可加机器 + 负载均衡,会话与缓存用 Redis 集中。
|
|
|
- 数据库:主从读写分离、慢查询优化;日志表可按时分区或归档。
|
|
|
- 带宽与转码:随量在云上扩容,无需自建。
|
|
|
|
|
|
### 5.6 承载量结论表(示例)
|
|
|
|
|
|
| 维度 | 当前假设下容量 | 扩展方式 |
|
|
|
|------|----------------|----------|
|
|
|
| 业务 API | 50~80 QPS,P99 < 500 ms | 增加应用节点、DB 优化/读写分离 |
|
|
|
| 同时在线学习 | 约 500(点播)+ 单场 200(直播) | 视频全部走 CDN/云服务,按量扩容 |
|
|
|
| 存储(DB) | 1~5 GB,30 MB/天日志 | 分区/归档、冷热分离 |
|
|
|
| 预期可支撑 | 约 5,000 注册、2,000 日活、500 同时学习 | 按客户目标替换假设后重算 |
|
|
|
|
|
|
---
|
|
|
|
|
|
## 六、实施建议与风险
|
|
|
|
|
|
### 6.1 实施阶段建议
|
|
|
|
|
|
| 阶段 | 内容 | 周期参考 |
|
|
|
|------|------|----------|
|
|
|
| 一期 | 课程管理、录播点播、学习进度、基础报表;对接云点播 | 4~6 周 |
|
|
|
| 二期 | 直播、练习/考试、评论与笔记 | 3~4 周 |
|
|
|
| 三期 | 运营报表增强、错题本、消息通知、体验优化 | 2~3 周 |
|
|
|
|
|
|
先保证「能上课、能记进度、能看数据」,再上直播与练习,可控制风险与返工。
|
|
|
|
|
|
### 6.2 风险与应对
|
|
|
|
|
|
| 风险 | 应对 |
|
|
|
|------|------|
|
|
|
| 视频带宽/成本超预期 | 明确用 CDN + 云点播/直播,按量计费;设置清晰度与码率策略 |
|
|
|
| 进度与完成规则复杂 | 先实现「按课时完成比例」的简单规则,再迭代条件(如必须做完练习) |
|
|
|
| 高并发下 DB 成为瓶颈 | 索引优化、读写分离、热点表(如 progress)可考虑分表或缓存 |
|
|
|
| 直播延迟与稳定性 | 完全依赖云直播方案,选成熟厂商并做单场压测与回放验证 |
|
|
|
|
|
|
### 6.3 与客户对焦事项
|
|
|
|
|
|
- **用户规模**:确认日活、同时在线、单课程最大并发,用于替换 4.1 的假设并重算承载量。
|
|
|
- **完成规则**:是否必须做题、是否必须看完全部视频、是否有证书/学分。
|
|
|
- **直播需求**:是否必须、场次频率、是否需要连麦/白板等,以决定是否采用「云直播 + 回放」即可。
|
|
|
- **合规与版权**:课程版权、个人信息与学习数据留存策略、审计日志要求。
|
|
|
|
|
|
---
|
|
|
|
|
|
## 七、文档与交付物建议
|
|
|
|
|
|
- **功能规格**:在本文第二、四节基础上细化成「课程管理」「学习进度」「视频/直播」「练习考试」「统计报表」等子规格,便于开发与验收。
|
|
|
- **承载量报告**:将 5.1 的假设改为客户确认数据后,重新计算 5.2~5.5,输出一页「承载量评估结论表」和「扩展建议」,便于运维与采购。
|
|
|
- **接口文档**:对 4.3 中接口出 OpenAPI/Swagger,便于前后端联调与测试。
|
|
|
|
|
|
---
|
|
|
|
|
|
**文档版本**:v1.0
|
|
|
**适用场景**:线上课程平台客户需求的技术实现方案与承载量评估,可作为投标/立项文档的附录或正文依据。
|