线上课程平台功能设计与承载量评估
一、需求概述与目标
核心需求:为客户建设一套可用的线上课程平台,支持课程发布、学习管理、直播/录播、互动与数据统计,并能在预期用户规模下稳定运行。
目标:
- 功能完整:覆盖课程生命周期、学习行为、互动与运营统计
- 可落地:技术方案与现有技术栈兼容,便于实施与迭代
- 可评估:对并发、带宽、存储等承载量有清晰估算与扩展路径
二、功能模块设计
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
适用场景:线上课程平台客户需求的技术实现方案与承载量评估,可作为投标/立项文档的附录或正文依据。