
1) 【一句话结论】:采用微服务架构结合分库分表、分布式缓存与消息队列解耦,通过弹性伸缩与缓存预热策略,有效支撑百万级学生、十万级课程的高并发,并针对性优化开学季/考试季的峰值流量应对。
2) 【原理/概念讲解】:高并发在线学习平台设计需遵循“分层解耦”与“资源弹性”原则。系统拆分为三层:前端展示层(用户交互)、应用服务层(用户、课程、学习记录等微服务,如用户服务、课程服务、学习记录服务)、数据服务层(数据库、缓存、消息队列)。数据库选型上,结构化数据(如用户信息、课程表、订单、学习记录)采用MySQL,通过分库分表扩展存储与查询能力:按学校ID分库(每个学校独立数据库,如school_1_db,避免跨校数据冲突),按课程ID分表(如课程表course按course_id % 100分片,如course_0、course_1等,应对热门课程集中访问,通过动态调整分片数量或冷热数据分离(如将冷门课程数据迁移至冷存储)缓解热点不均;读写分离通过ShardingSphere代理实现,主库写、从库读,提升查询效率。非结构化数据(如学习日志、用户行为、课程内容)用MongoDB,支持高吞吐与灵活存储。缓存以Redis为核心,缓存热点数据(如热门课程列表、用户登录态、课程详情),减少数据库压力;消息队列(如Kafka、RabbitMQ)用于异步解耦,处理非实时业务(如生成学习报告、发送考试通知、批量数据同步),避免阻塞核心服务。开学季时,预置更多服务器资源,并提前加载热门课程到缓存(缓存预热,如开学前24小时加载热门课程数据至Redis);考试季时,优化消息队列消费策略(增加消费者数量、调整消费线程数),确保系统在高并发下稳定运行。
3) 【对比与适用场景】:
| 类别 | MySQL | MongoDB |
|---|---|---|
| 定义 | 关系型数据库,结构化数据,支持ACID事务 | NoSQL数据库,非结构化/半结构化数据,高可扩展 |
| 特性 | 强一致性,事务支持(事务范围受限于单库),查询灵活(SQL) | 最终一致性,高吞吐,无事务,灵活存储(文档模型) |
| 使用场景 | 用户信息、课程表、订单、学习记录(结构化,需事务) | 学习日志、用户行为数据、课程内容(非结构化,高吞吐) |
| 注意点 | 分库分表复杂,事务范围受限于单库;百万级数据下需分库分表 | 数据一致性需额外设计(如补偿机制);查询复杂度较高,需优化索引 |
| 类别 | Redis | Memcached |
|---|---|---|
| 定义 | 基于内存的数据库,支持数据持久化、事务、多数据结构 | 基于内存的键值存储,仅缓存,不支持持久化、事务 |
| 特性 | 支持数据持久化(RDB/AOF),事务,多数据结构(列表、集合等) | 仅缓存,数据不持久化,简单键值操作 |
| 使用场景 | 热点数据缓存(如用户登录态、热门课程)、分布式锁、消息队列 | 简单缓存(如页面静态数据、临时数据),对持久化要求低 |
| 注意点 | 内存占用高,需合理设置内存大小;持久化配置复杂 | 性能高,但功能单一,不适合复杂数据操作(如事务、持久化) |
| 类别 | Kafka | RabbitMQ |
|---|---|---|
| 定义 | 分布式流处理平台,高吞吐、持久化 | 企业级消息队列,可靠投递、点对点/发布订阅 |
| 特性 | 高吞吐(百万级消息/秒)、持久化、分区复制 | 队列模型,支持事务、死信队列,可靠投递 |
| 使用场景 | 高吞吐日志(如学习记录、用户行为)、批量处理、实时数据管道 | 实时通知(如考试提醒)、点对点任务(如生成学习报告)、可靠消息传递 |
| 注意点 | 需要集群管理,配置复杂;消息持久化需手动清理 | 队列积压风险,需监控队列长度;事务处理复杂(如事务消息) |
4) 【示例】:用户请求“热门课程列表”的流程(伪代码):
用户请求热门课程列表
1. 应用层调用课程服务
2. 课程服务检查Redis缓存(key: "hot_course_list_{school_id}")
- 若命中:返回缓存数据
- 否则:通过ShardingSphere代理查询MySQL数据库(表:course,条件:school_id = {school_id} 且 status=1 且 is_hot=1,分表规则:course_id % 100)
3. 将查询结果存入Redis(key: "hot_course_list_{school_id}",过期时间:300秒)
4. 返回课程列表给前端
(注:热门课程标识is_hot=1,开学季时动态更新热门课程,缓存预热时加载热门课程数据)
5) 【面试口播版答案】:设计高并发在线学习平台,核心是微服务拆分与资源弹性。首先,架构分层:前端展示、应用服务(用户、课程、学习记录等微服务)、数据服务(数据库、缓存、消息队列)。数据库选型上,用户、课程等结构化数据用MySQL,按学校ID分库(每个学校独立库,如school_1_db),按课程ID分表(如course_id % 100分片),读写分离用ShardingSphere,应对百万级数据。缓存用Redis,缓存热门课程列表、用户登录态,减少数据库压力。消息队列用Kafka处理学习日志(高吞吐),用RabbitMQ处理考试提醒(实时通知)。开学季时,预置更多服务器资源,并提前加载热门课程到缓存(缓存预热);考试季时,优化消息队列消费策略(增加消费者)。用户登录时,先查Redis缓存用户信息,命中则快速返回;课程列表查询时,优先从Redis获取,缓存失效则查询数据库并更新缓存。这样能保证系统在开学季/考试季的峰值流量下稳定。
6) 【追问清单】:
7) 【常见坑/雷区】: