
1) 【一句话结论】采用微服务+分布式数据库(按校区分库分表)+Saga分布式事务架构,以API网关统一入口,核心服务拆分,结合Redis缓存和Kafka消息队列,通过Saga模式处理跨服务事务,确保多校区高并发下的数据一致性和设备状态实时同步。
2) 【原理/概念讲解】系统架构上,微服务将功能拆分为用户、预约、设备、权限等独立服务,通过API网关接收请求并路由。多校区数据分片:将数据库按校区拆分(如绍兴校区、上虞校区各独立数据库),设备表按校区分表,避免单库压力。Saga模式:预约流程分为“创建预约记录”“更新设备状态”“发送通知”等步骤,每个步骤独立执行,失败时通过补偿事务回滚,保证最终一致性。消息队列分区:Kafka按校区或设备类型创建分区,每个分区处理特定校区的消息,提高吞吐。设备状态同步:设备状态变更(如被预约)通过Kafka发布,各服务订阅后更新本地缓存,若消息丢失或失败,重试机制确保最终同步,幂等性处理避免重复更新。
类比:就像学校里每个校区有独立的教务系统(分布式数据库),预约设备时,流程像“先订票(创建预约)→改设备状态(停用)→发通知(短信/邮件)”,如果中间某步失败,Saga会自动补偿(比如设备状态恢复可用),保证数据正确。
3) 【对比与适用场景】
| 技术选型 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| MySQL(分库分表) | 关系型数据库按逻辑分库分表 | ACID事务,强一致性,支持复杂查询 | 核心数据(用户、预约、设备,按校区分库) | 需要分库分表方案(如ShardingSphere),跨库事务复杂 |
| TiDB | 分布式MySQL | ACID事务,强一致性,自动分片 | 多校区数据,支持高并发读写 | 需要集群部署,成本较高 |
| Kafka | 消息队列 | 高吞吐、持久化、分区 | 异步通知、设备状态同步 | 需要分区策略,消费端批量处理 |
| Saga模式 | 分布式事务模式 | 分步骤执行,失败补偿 | 跨服务事务(预约+设备状态变更) | 需要补偿逻辑,保证最终一致性 |
4) 【示例】预约请求示例(多校区):
{
"user_id": "student_123",
"device_id": "lab1_pc01",
"schedule": {
"start_time": "2024-09-20T14:00:00Z",
"end_time": "2024-09-20T16:00:00Z",
"campus": "绍兴校区",
"lab_id": "化学实验室"
},
"role": "student"
}
处理流程(Saga步骤):
若步骤2失败,Saga补偿步骤:设备服务查询预约记录,若存在,恢复设备状态(发布“设备释放”消息)。
5) 【面试口播版答案】(约90秒)
“面试官您好,针对多校区、多设备的在线预约系统,我设计采用微服务+分布式数据库(按校区分库分表)+Saga分布式事务架构。核心服务拆分为用户、预约、设备、权限等模块,通过API网关统一入口。为应对开学季高并发,API网关采用令牌桶限流,Redis缓存热点数据(如设备列表),消息队列(Kafka)按校区分区处理预约请求,异步处理通知,减少请求阻塞。多校区数据分片:数据库按校区拆分,设备表按校区分表,避免单库压力。设备状态实时同步通过Kafka发布状态变更,各服务订阅后更新本地缓存,若消息丢失,重试机制确保最终同步。权限控制基于RBAC模型,管理员管理角色,教师预约设备,学生查看预约,通过JWT令牌跨服务认证。系统扩展性上,服务独立部署,新增校区或设备只需新增对应服务实例,通过服务注册发现(如Nacos)动态发现。整体架构兼顾高并发、数据一致性和扩展性,满足多校区实验预约需求。”
6) 【追问清单】
7) 【常见坑/雷区】