
1) 【一句话结论】
采用分层微服务架构,以事件驱动实现多校区实时数据同步,结合TiDB(按校区分片)作为分布式数据库、Kafka作为消息队列、Redis作为缓存,通过最终一致性保障数据一致性,异步处理应对高并发,满足全国多校区、百万级数据、10万QPS峰值的需求。
2) 【原理/概念讲解】
首先,明确核心需求:多校区(分布式节点)、百万级学生/千级教师(海量数据与高并发)、实时更新(低延迟)、数据一致性(多校区同步)、高并发(开学季10万QPS)。
3) 【对比与适用场景】
数据分片策略
| 策略 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| 按校区分片 | 每个校区对应一个数据库分片,数据隔离 | 数据独立,跨校区查询需聚合,本地读写快 | 多校区,数据本地化 | 跨校区查询延迟,需聚合逻辑 |
| 按课程ID分片 | 按课程ID哈希分片,跨校区课程数据分散 | 课程跨校区,查询需跨分片 | 课程跨校区 | 查询复杂,分片键选择影响性能 |
消息队列选型
| 选项 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| Kafka | 分布式消息系统,基于日志存储 | 高吞吐(10万+QPS)、持久化、多消费者 | 实时日志、事件驱动 | 资源消耗大,延迟低 |
| RabbitMQ | AMQP协议,队列消息系统 | 队列,消息持久化 | 中等规模,解耦 | 延迟较高,适合小并发 |
缓存策略
| 选项 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| Redis集群 | 内存数据库,支持读写分离 | 高性能,支持数据结构,持久化 | 热点数据(教师、课程表) | 容量有限,需缓存预热 |
4) 【示例】
教师调整课时的流程(伪代码):
前端请求:
POST /api/teacher/adjust
{
"courseId": 123,
"oldTime": "2024-09-10 10:00",
"newTime": "2024-09-10 14:00"
}
核心服务处理:
{
"courseId": 123,
"action": "update",
"oldTime": "10:00",
"newTime": "14:00",
"timestamp": 1701234567
}
UPDATE course_schedule SET time = '14:00' WHERE courseId=123 AND time='10:00';
hset course:123 schedule, "14:00"
前端实时推送:通过WebSocket将更新后的课程表推送给学生端。
5) 【面试口播版答案】
面试官您好,针对好未来的排课系统需求,我设计的整体架构是分层微服务架构,核心是通过事件驱动实现多校区实时数据同步。具体来说,系统分为前端服务、排课核心服务(微服务)、分布式数据库(TiDB)、消息队列(Kafka)、缓存(Redis)这几层。教师调整课时时,核心服务生成事件发送到Kafka,各校区消费后同步数据,确保实时更新。热点数据存入Redis缓存,提升响应速度。高并发时,消息队列缓冲请求,开学季10万QPS峰值也能稳定运行。数据一致性通过最终一致性保障,核心数据(课程表)通过Kafka事件同步,非核心数据允许短暂不一致,不影响业务。技术选型上,TiDB按校区分片存储百万级数据,Kafka处理高吞吐,Redis集群缓存热点数据,整体满足全国多校区、高并发、实时更新的需求。
6) 【追问清单】
7) 【常见坑/雷区】