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

17 KiB

线上课程平台功能设计与承载量评估

一、需求概述与目标

核心需求:为客户建设一套可用的线上课程平台,支持课程发布、学习管理、直播/录播、互动与数据统计,并能在预期用户规模下稳定运行。

目标

  • 功能完整:覆盖课程生命周期、学习行为、互动与运营统计
  • 可落地:技术方案与现有技术栈兼容,便于实施与迭代
  • 可评估:对并发、带宽、存储等承载量有清晰估算与扩展路径

二、功能模块设计

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_progresscourse_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_videoscourse_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
适用场景:线上课程平台客户需求的技术实现方案与承载量评估,可作为投标/立项文档的附录或正文依据。