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,后续请求携带。
- 请求课程页面:
- CDN/Nginx分发请求至Server1。
- Server1验证请求头中的JWT(Redis验证token有效性),若有效,获取用户信息(缓存中已存在,避免数据库查询)。
- Server1查询Redis缓存课程信息(key:
course:info:course_id),若命中,返回;否则查询数据库从库(如course_db),结果存入Redis(随机过期时间,如10s+随机1-5s偏移)。
- Server1通过WebSocket建立长连接(用户ID为连接标识),并调用Kafka生产者发送“推送直播流”消息(主题:
live_stream,分区:按user_id哈希,消息体:直播流数据)。
- 直播流推送:
- Kafka消费者(消费分区:user_id % 10)接收消息,处理直播流数据(如HLS分段)。
- 通过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:架构设计脱离实际业务:比如小规模系统用微服务反而增加复杂度,需根据业务规模选择架构,避免过度设计。