
1) 【一句话结论】:针对好未来数百万学生、数万课程的高并发课程表管理服务,核心采用微服务拆分(选课、排课、查询、通知等)、分布式缓存(Redis)、消息队列(Kafka)、数据库分库分表(用户分库、课程分表),通过读写分离、异步处理、缓存预热等策略,支撑高并发低延迟,并有效应对开学季流量峰值。
2) 【原理/概念讲解】:老师口吻,解释关键设计逻辑:
3) 【对比与适用场景】:
| 策略 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| 缓存雪崩 | 大量缓存失效(如Redis宕机或集中过期),导致所有请求都去数据库,引发瞬时高并发 | 瞬时流量激增,数据库压力爆炸 | 高并发场景,缓存集中失效 | 设置短时间过期(如5分钟),或使用分布式锁控制并发写入,或限流(熔断器) |
| 缓存击穿 | 单个热点数据失效(如热门课程表),所有请求都去数据库,导致单点压力 | 单点高并发,数据库单点压力 | 热点数据查询(如热门课程) | 设置默认值(如“课程未找到”),或提前预热(将热点数据加载到缓存,设置较长时间过期) |
| 缓存穿透 | 查询不存在的数据(如非法课程ID),缓存和数据库都无结果,导致流量穿透 | 恒定无效流量,消耗资源 | 非法查询或恶意攻击 | 存空值(如“null”),或使用布隆过滤器过滤无效请求,避免查询数据库 |
| 方案 | 适用场景 | 实现方式 | 优点 | 缺点 |
|---|---|---|---|---|
| 强一致性(SAGA模式) | 需要立即同步所有服务数据(如用户选课后,查询服务立即返回最新数据) | 选课服务→更新课程容量→发布事件→查询服务消费 | 数据实时一致,用户体验好 | 性能低,复杂度高,故障时可能阻塞 |
| 最终一致性(事件驱动+补偿) | 非实时性数据(如课程调整通知),允许短暂不一致 | 发布-订阅(Kafka),补偿机制(Saga) | 性能高,系统解耦 | 数据可能短暂不一致,需补偿 |
4) 【示例】:
def user_select_course(user_id, course_id):
key = f"user_course:{user_id}:{course_id}"
if redis.setnx(key, "pending", ex=10): # 10秒锁
course = db.query("SELECT capacity FROM course WHERE id = ?", course_id)
if course.capacity <= 0:
redis.delete(key) # 容量不足,取消锁
return "课程已满"
db.update("UPDATE course SET capacity = capacity - 1 WHERE id = ?", course_id)
db.insert("INSERT INTO user_course (user_id, course_id) VALUES (?, ?)", user_id, course_id)
redis.set(key, "true", ex=3600) # 设置有效时间
return "选课成功"
else:
return "已处理该请求,请稍后重试"
def adjust_course_schedule(course_id, new_schedule):
db.update("UPDATE course_schedule SET schedule = ? WHERE id = ?", new_schedule, course_id)
kafka_producer.send("course_adjust_topic", value=json.dumps({"course_id": course_id, "new_schedule": new_schedule}))
def process_course_adjust(message):
data = json.loads(message.value)
course_id = data["course_id"]
new_schedule = data["new_schedule"]
user_ids = db.query("SELECT user_id FROM user_course WHERE course_id = ?", course_id)
notification_service.send(user_ids, f"课程{course_id}调整,新安排:{new_schedule}")
5) 【面试口播版答案】:面试官您好,针对好未来数百万学生、数万课程的高并发课程表管理服务,我的核心设计思路是采用微服务拆分(选课、排课、查询、通知等)、分布式缓存(Redis)、消息队列(Kafka)、数据库分库分表(用户分库、课程分表),通过读写分离、异步处理、缓存预热等策略,支撑高并发低延迟,并有效应对开学季流量峰值。具体来说,选课服务处理用户选课,排课服务检查时间冲突,查询服务提供课程表展示;查询服务先从Redis缓存获取数据,缓存未命中则查询数据库并回写;课程调整等非实时请求通过Kafka异步处理,避免阻塞主流程;数据库按用户ID分库、课程ID分表,结合读写分离降低压力。这样既能保证低延迟,又能应对开学季的流量冲击。
6) 【追问清单】:
7) 【常见坑/雷区】: