51mee - AI智能招聘平台Logo
模拟面试题目大全招聘中心会员专区

分析在线直播课系统的高并发问题,如何设计架构以支持数千名学生同时在线学习?

学而思素养教师难度:困难

答案

1) 【一句话结论】为支持数千学生同时在线的高并发需求,需构建以负载均衡、分布式缓存、消息队列解耦、数据库分库分表为支撑的微服务架构,通过量化指标(如QPS≥5000、请求延迟≤200ms)确保系统稳定与性能。

2) 【原理/概念讲解】高并发系统设计核心是“请求分发-服务解耦-资源隔离-异步处理”,关键组件:

  • 负载均衡:Nginx/LVS按IP哈希分发请求,避免会话粘连,确保请求均匀分布(类比:交通枢纽,把流量分散到各服务器,避免某个点拥堵)。
  • 分布式缓存(Redis):缓存热点数据(用户信息、课程列表),减少数据库压力。缓存雪崩用随机过期时间(如10s+随机1-5s偏移);缓存穿透用布隆过滤器(预判不存在的key,避免查询数据库)或空对象缓存(缓存null值)。
  • 消息队列(Kafka):处理异步任务(直播流推送、用户行为记录),解耦服务。对于顺序敏感的直播流,用分区+顺序消费(每个用户消息分配固定分区,如user_id % 10),确保消息按顺序处理。
  • 数据库分库分表:读写分离(主库写,从库读),分库按业务拆分(用户表在user_db,课程表在course_db),分表按ID哈希(如user_id % 8),避免单库瓶颈,提升读写性能(类比:把大仓库分成多个小仓库,每个小仓库负责一部分,提升取货效率)。

3) 【对比与适用场景】

架构模式定义特性使用场景注意点
单体架构所有功能集成在一个服务中代码耦合度高,扩展困难小规模系统,开发简单难以应对高并发,故障影响全系统
微服务架构按业务拆分为独立服务服务解耦,独立部署大规模系统,高并发需求需要服务治理(注册、发现、熔断)
本地缓存单机部署的缓存速度快,成本低小规模,数据量小无法共享,高并发下易溢出
分布式缓存(Redis)多节点部署的缓存支持高并发读写,数据共享大规模系统,热点数据缓存需要分布式部署,避免缓存雪崩
数据库分库分表按业务/分片拆分数据库提升读写性能,扩展性强高并发、大数据量的数据库需要路由规则,可能增加复杂度

4) 【示例】(请求流程,含登录验证与实时交互)

  • 用户登录:学生访问登录页,提交用户名/密码,后端验证后生成JWT(含用户ID、过期时间),存入Redis(key: user:session:token,value: 用户信息,过期时间:30分钟)。客户端存储JWT,后续请求携带。
  • 请求课程页面:
    1. CDN/Nginx分发请求至Server1。
    2. Server1验证请求头中的JWT(Redis验证token有效性),若有效,获取用户信息(缓存中已存在,避免数据库查询)。
    3. Server1查询Redis缓存课程信息(key: course:info:course_id),若命中,返回;否则查询数据库从库(如course_db),结果存入Redis(随机过期时间,如10s+随机1-5s偏移)。
    4. Server1通过WebSocket建立长连接(用户ID为连接标识),并调用Kafka生产者发送“推送直播流”消息(主题:live_stream,分区:按user_id哈希,消息体:直播流数据)。
  • 直播流推送:
    1. Kafka消费者(消费分区:user_id % 10)接收消息,处理直播流数据(如HLS分段)。
    2. 通过WebSocket长连接将直播流推送给用户(WebRTC或HLS协议,低延迟传输)。

5) 【面试口播版答案】(约90秒)
“针对数千学生同时在线的高并发,核心是构建分层微服务架构。首先,前端通过CDN和Nginx负载均衡分发请求,避免单点过载。后端拆分为用户、课程、直播等模块,用户和课程信息用Redis分布式缓存,减少数据库压力。对于直播流推送,采用Kafka消息队列解耦,结合WebSocket长连接,确保实时性。数据库层面做读写分离+分库分表,主库写,从库读,分库按业务(用户、课程),分表按ID哈希,提升性能。通过这些设计,系统可支持高并发下的稳定运行,满足QPS≥5000、请求延迟≤200ms的指标。”

6) 【追问清单】

  • 追问1:数据库如何实现分库分表?
    回答要点:按业务分库(如用户表在user_db,课程表在course_db),按ID哈希分表(如用户表user_id % 8,分8张表),读写分离用主从复制,路由规则(如ShardingSphere)实现分库分表。
  • 追问2:缓存雪崩/穿透如何处理?
    回答要点:缓存雪崩用随机过期时间(如10s+随机1-5s偏移);缓存穿透用布隆过滤器(预判不存在的key,避免查询数据库)或空对象缓存(缓存null值)。
  • 追问3:消息队列如何保证直播流的顺序?
    回答要点:使用Kafka的分区+顺序消费,每个用户消息分配固定分区(如user_id % 10),消费者按分区顺序处理,确保顺序。
  • 追问4:系统如何进行容灾?
    回答要点:多机房部署(主备),数据库主从复制+同步,缓存数据同步(如Redis集群),消息队列持久化(Kafka日志持久化),网络冗余(多线路)。
  • 追问5:如何监控高并发下的系统性能?
    回答要点:用Prometheus+Grafana监控QPS、请求延迟、缓存命中率、消息队列积压,设置告警阈值(如QPS超过5000触发告警)。

7) 【常见坑/雷区】

  • 坑1:忽略实时交互的WebSocket配合:只提缓存和消息队列,未说明实时消息的传输机制,导致系统无法支持低延迟的直播流。
  • 坑2:数据库分库分表未做读写分离:单库读写性能仍不足,可能导致请求延迟过高,影响用户体验。
  • 坑3:缓存未分布式部署:单机缓存易溢出,无法支持高并发,需用Redis集群,否则缓存雪崩风险大。
  • 坑4:消息队列未考虑顺序:直播流顺序错乱会影响学习体验,需用分区+顺序消费,否则可能导致内容混乱。
  • 坑5:架构设计脱离实际业务:比如小规模系统用微服务反而增加复杂度,需根据业务规模选择架构,避免过度设计。
51mee.com致力于为招聘者提供最新、最全的招聘信息。AI智能解析岗位要求,聚合全网优质机会。
产品招聘中心面经会员专区简历解析Resume API
联系我们南京浅度求索科技有限公司admin@51mee.com
联系客服
51mee客服微信二维码 - 扫码添加客服获取帮助
© 2025 南京浅度求索科技有限公司. All rights reserved.
公安备案图标苏公网安备32010602012192号苏ICP备2025178433号-1