
1) 【一句话结论】
核心是通过**Saga模式(分布式事务)+ 分布式缓存(Redis集群)+ 低延迟消息队列(Kafka)**的组合架构,保障多用户修改题目时的数据一致性,同时利用流处理(如Flink)实现成绩的秒级统计,满足实时性需求。
2) 【原理/概念讲解】
老师口吻,解释关键概念:
3) 【对比与适用场景】
| 模式 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| Saga(顺序提交) | 通过本地事务+补偿事务实现分布式事务 | 强一致性,失败时回滚 | 教师上传题目(核心数据修改,需立即同步) | 高并发下补偿事务可能延迟,需优化超时 |
| 最终一致性(事件溯源) | 事件发布后逐步同步 | 性能高,允许短暂延迟 | 学生练习成绩统计(允许1秒内延迟) | 需补偿机制(如重试) |
4) 【示例】
def upload_question(question_data):
# 1. 写入数据库(本地事务)
db.transactional_insert("questions", question_data)
# 2. 写入缓存(本地事务)
redis.set(f"q_{question_data['id']}", question_data["content"])
# 3. 发布消息(本地事务)
kafka_producer.send("question_upload", question_data)
# 4. 提交事务
commit()
def rollback_upload(question_id):
# 删除数据库记录
db.delete("questions", question_id)
# 删除缓存
redis.delete(f"q_{question_id}")
# 撤销消息
kafka_consumer.acknowledge("question_upload", question_id)
POST /api/submit_answer
{
"student_id": "S001",
"question_id": "Q001",
"answer": "A1"
}
# 后端处理:
# 1. 校验题目有效性(缓存)
if not redis.exists(f"q_{question_id}"):
return error("题目无效")
# 2. 计算成绩(本地)
score = calculate_score(answer, redis.get(f"q_{question_id}"))
# 3. 写入成绩表(数据库)
db.insert("scores", {"student_id": "S001", "question_id": "Q001", "score": score})
# 4. 发布成绩统计消息
kafka_producer.send("score_stats", {"student_id": "S001", "question_id": "Q001", "score": score})
# 5. 返回结果
return {"score": score, "message": "练习完成"}
5) 【面试口播版答案】
各位面试官好,针对数学在线题库系统,我的设计核心是通过**Saga模式(分布式事务)+ Redis集群(缓存)+ Kafka(消息队列)**的组合方案,兼顾数据一致性与实时性。教师上传题目时,采用Saga模式确保多用户修改题目时数据不冲突——就像流水线作业,每个步骤(数据库、缓存、消息发布)按顺序执行,失败则回滚,保证题目内容、答案等核心数据同步。学生练习后即时显示结果,依赖Redis缓存题目信息(快速取题目内容),同时用Kafka异步处理成绩统计(避免高并发系统卡顿),成绩通过流处理秒级计算,确保学生提交后秒级看到结果。这样既解决了多用户并发修改的冲突问题,又保证了练习结果的实时反馈,满足系统需求。
6) 【追问清单】
7) 【常见坑/雷区】