摘要: 开学季是教培机构的流量高峰,本文以一个真实教务系统为例,讲述如何从单体架构逐步演进到支持万级并发在线的微服务架构,包括分库分表、缓存策略和分布式事务的处理方案。
正文:
一、业务背景与流量特征
教培机构的流量有明显的潮汐特征:平时工作日白天几乎无流量,但以下三个时间点会瞬间打满:
-
春季/秋季开学季的报名缴费
-
每学期末的成绩查询与续费窗口
-
每晚 7-9 点的家长端查看课表、作业的高峰期
QPS 峰值可能是日常的 50 倍以上,架构设计必须围绕这个特征展开。
二、演进路径
阶段1:单体架构(0-500 学员)
一个 Spring Boot 单体 + MySQL + Redis 就能撑住。这个阶段最重要的是表结构设计规范,重点表包括:
sql
复制
-- 核心表结构示意
student(id, name, phone, status, org_id)
course(id, name, teacher_id, org_id, capacity)
class_session(id, course_id, room_id, start_time, end_time)
enrollment(id, student_id, course_id, total_lessons, used_lessons)
attendance(id, session_id, student_id, status, consume_lessons)
enrollment.used_lessons(已消课时)和 attendance 是家长最敏感的数据,任何更新都要记录流水表。
阶段2:读写分离 + 缓存(500-5000 学员)
-
读多写少:课表查询、课程列表全部走 Redis 缓存,缓存粒度按「班级 + 日期」组织
-
消息队列削峰:报名缴费走 RabbitMQ 异步落单,前端先返回「处理中」
-
动静分离:家长端课表页是典型的高频静态数据,CDN + 接口缓存命中率做到 95% 以上
阶段3:微服务拆分(5000+ 学员,多校区)
按业务域拆为四个核心服务:
表格
复制
| 服务 | 职责 | 技术要点 |
|---|---|---|
| user-service | 账号与权限 | JWT + RBAC,支持多租户 |
| schedule-service | 排课与教室资源 | 冲突检测算法,独立部署 |
| finance-service | 收费与课消 | 强一致,本地事务 + 对账任务 |
| notify-service | 家校通知 | 消息队列消费,失败重试 |
拆分原则:finance-service 绝不依赖其他服务的实时调用,只通过 MQ 同步数据,避免分布式事务。
三、三个关键技术决策
-
课消用「本地消息表」保证最终一致:签到成功后写入本地事务消息表,异步同步到财务服务,对账任务兜底。
-
排课冲突检测下沉到数据库 :用
INSERT ... ON CONFLICT或唯一索引约束(教室+时间段),而不是先查再插。 -
多租户隔离按 org_id 路由:中小 SaaS 用「共享库 + 行级隔离」即可,大机构才考虑分库。
结语
架构没有一步到位,跟随业务规模逐步演进才是最优解。如果想快速验证业务、避免重复造轮子,可以参考市面上成熟的爱耕云教务系统的模块划分和交互设计,它对中小型团队的架构落地有很好的借鉴意义。
标签: #微服务 #高并发 #架构设计 #教务系统 #分库分表 #分布式事务