
1) 【一句话结论】采用微服务架构+分布式组件设计,通过负载均衡分散请求、缓存加速热点数据、消息队列解耦实时监控、数据库分库分表保障高并发与高可用,实现百万级用户同时在线的秒级响应与99.9%以上高可用。
2) 【原理/概念讲解】
3) 【对比与适用场景】
| 组件 | 定义/特性 | 使用场景 | 注意点 |
|---|---|---|---|
| 缓存(Redis) | 支持高并发读写、数据持久化、事务、发布订阅 | 热点数据(用户状态、考试题目) | 需设置过期时间,避免缓存穿透 |
| 缓存(Memcached) | 简单缓存,不支持持久化、事务 | 简单缓存(如临时数据) | 数据易丢失,适合非关键场景 |
| 消息队列(Kafka) | 高吞吐、持久化、分布式、多消费者 | 实时监控、日志、解耦服务 | 需考虑消息堆积与消费延迟 |
| 消息队列(RabbitMQ) | 支持多种消息模型(队列/主题)、路由 | 复杂路由场景(如多服务消费) | 配置复杂,适合业务逻辑复杂场景 |
| 数据库(MySQL) | 关系型,事务一致性强 | 结构化数据(用户信息、考试记录) | 需分库分表,避免单表性能瓶颈 |
| 数据库(MongoDB) | NoSQL,灵活数据结构 | 非结构化数据(答题内容、日志) | 无事务支持,需保证数据一致性 |
4) 【示例】
user_table)按用户ID哈希分库(如库1存储ID 1-100万,库2存储100万+),避免单库数据量过大。exam_record)按考试ID时间范围分表(如表1存储考试ID 1-1000,表2存储1001-2000),提升查询性能。# 考试服务更新答题时间
def update_answer_time(user_id, exam_id, new_time):
# 从Redis获取用户状态(剩余时间)
user_state = redis.get(f"user_{user_id}_state")
# 更新Redis用户状态
redis.set(f"user_{user_id}_state", new_time)
# 通过Kafka发送答题时间变更消息
kafka_producer.send("exam_answer_time_topic",
value={"user_id": user_id, "exam_id": exam_id, "new_time": new_time})
5) 【面试口播版答案】
面试官您好,针对百万级用户同时在线的在线考试系统,我的设计思路是采用微服务架构+分布式组件,核心是分层设计:前端层用负载均衡(Nginx)分发请求到多台应用服务器,应用层拆分为用户、考试、监控等微服务,数据层通过缓存(Redis)加速热点数据,消息队列(Kafka)解耦实时监控,数据库分库分表保障高并发。具体来说,负载均衡分发请求后,考试服务从Redis获取用户剩余时间,更新后通过Kafka发送答题时间变更,监控服务消费消息更新界面;数据库通过分库(用户表按ID哈希)分表(考试记录按考试ID时间范围),实现99.9%高可用和秒级响应。
6) 【追问清单】
7) 【常见坑/雷区】