2022年秋:单体架构在重庆多校区场景下的首次崩塌

2022年9月15日凌晨2:17,重庆工商大学教务处服务器监控告警触发第13次OOM(Out of Memory)——这是当年秋季排课季的第47个崩溃时刻。系统仍运行着2016年采购的Java EE单体排课系统,核心调度引擎基于回溯算法封装,硬编码了“主校区-南岸校区”双节点拓扑,却对2021年新增的茶园校区完全不可见。更致命的是,该系统将所有教室资源统一存入MySQL单表classroom,未做地理分区,当查询“南岸校区周三下午空闲阶梯教室”时,需全表扫描12,843条记录,平均响应延迟达8.3秒。我们调取了当时导出的thread_dump.log,发现线程池pool-2-thread-15在ScheduleEngine.calculateConflict()方法中卡死超11分钟,根源是其依赖的CourseTimeRule类仍将“民族节日调休”硬编码为全国统一日期,而重庆市教委2022年明确要求高校执行《川渝高校联合调休试行办法》,将农历七月十五设为教学缓冲日——该规则未被解析,导致系统反复尝试将37门通识课强行排入已标记为“禁排”的时段。此时,教务员不得不打开Excel手工拖拽课表,用颜色标注冲突单元格,再拍照发至各学院教学秘书微信群。这种原始协作方式在三校区并行排课时彻底失效:南岸校区某教师同一时段被排进3门课,而茶园校区新装的智慧教室设备ID(如QY-SMART-2023-087)因未录入基础库,系统直接忽略其存在,将其等同于普通空教室参与调度。
2023年春:微服务拆分与重庆地域规则引擎落地
2023年3月,该校启动排课管理系统重构,放弃商业套件,采用Spring Cloud Alibaba技术栈自研。核心突破在于将原单体拆解为四个自治服务:schedule-core(冲突检测与优化)、resource-gateway(教室/教师/课程元数据)、rule-engine(地域化业务规则)和notify-service(微信/钉钉实时预警)。其中rule-engine专为重庆定制:它加载chongqing_rules.yaml配置文件,内含semester_start_date: "2023-02-20"、holiday_adjustments: ["2023-08-15", "2023-10-23"](对应重庆市教委2023年第5号文),并支持动态热加载——当教委临时下发《关于调整清明节教学安排的通知》时,运维人员仅需修改YAML并调用POST /api/v1/rules/reload接口,无需重启服务。数据库层面,我们将原单表拆分为按校区哈希分区的PostgreSQL表:classroom_nanshan、classroom_yuanyang、classroom_chayuan,每个分区建有复合索引ON (campus_code, is_smart, capacity)。实测表明,在茶园校区查询“容纳200人以上智慧教室”响应时间从8.3秒降至127毫秒。关键字段设计上,classroom表新增geo_fence字段(JSONB类型),存储GeoJSON格式围栏坐标,例如茶园校区某楼栋的围栏定义为{"type":"Polygon","coordinates":[[[106.5821,29.5312],[106.5825,29.5312],[106.5825,29.5318],[106.5821,29.5318],[106.5821,29.5312]]]},使空间检索成为可能。此时,排课管理系统首次实现“校区级隔离+规则热插拔”,但尚未解决跨校区教师资源争抢问题——某位马克思主义学院教师在南岸与茶园校区同时承担本科与研究生课程,系统仍将其视为两个独立ID。

2023年秋:三校区协同调度与实时冲突熔断机制
2023年9月排课季,我们上线了排课管理系统的V2.3版本,核心是引入“教师全域唯一标识”与“熔断式冲突处理”。首先,在teacher主表中增加unified_id字段(UUIDv4),强制绑定教师在各校区的全部工号:{ "nanshan_id": "JS2018001", "yuanyang_id": "JS2018001-Y", "chayuan_id": "JS2018001-C" },并通过Kafka消息队列同步变更事件。其次,重构调度引擎,将原“全局最优解”目标改为“可接受冲突率阈值内最快收敛”,设置max_conflict_rate=0.035(即允许3.5%课时存在软冲突,如教师跨校区通勤时间不足25分钟)。当冲突率超过阈值,系统自动触发熔断:暂停当前批次调度,生成conflict_report.json,包含具体冲突项、影响课程数、建议调整方案(如“将《高等数学A》第5周周二第3-4节移至南岸校区X101”)。我们部署了Nacos作为配置中心,关键参数存于dataId=chongqing-schedule-prod,其中schedule.batch.size=1200(每批处理1200门课)、retry.max.attempts=5(单任务最大重试5次)、geo.distance.threshold.km=18.5(校区间通勤距离上限,依据重庆主城区实际路网测算)。9月12日0点首轮调度完成,总耗时4小时17分,生成课表冲突率为2.8%,低于阈值;其中茶园校区智慧教室使用率达91.3%,较去年提升37个百分点。教务处反馈,首次实现“零人工覆盖排课”,所有调整均通过系统推送的微信卡片一键确认。
2024年春:国产化信创适配与重庆高校联合排课试点
2024年3月,排课管理系统完成全栈信创适配:后端JDK升级至毕昇JDK 21,数据库迁移至openGauss 3.1(替代PostgreSQL),中间件替换为华为云ServiceStage微服务引擎。适配难点在于openGauss的PARTITION BY HASH语法与原PostgreSQL不兼容,我们重写了分区路由逻辑,在resource-gateway服务中嵌入PartitionRouter.java,根据campus_code哈希值映射到对应物理库(og_nanshan/og_yuanyang/og_chayuan)。更关键的是,重庆市教委牵头成立“成渝地区高校排课协同工作组”,我校作为首批试点单位,接入市级课表共享平台。排课管理系统新增inter_uni_scheduling模块,通过国密SM4加密通道,与四川外国语大学、西南政法大学等6所高校交换“教师跨校授课意向库”和“共享实验室预约状态”。例如,我校某教授申请赴西政开设《人工智能伦理》选修课,其时间偏好、设备需求等元数据经/api/v2/interuni/teacher-profile接口实时同步,西政排课系统在约束条件中自动加入该教师的“本校排课时段锁定”规则。目前,三校区日均处理跨校课表协同请求217次,平均延迟423毫秒。这标志着排课管理系统已从校内工具进化为区域教育治理基础设施——它不再仅解决“能不能排”,而是回答“如何让川渝高校的优质师资在物理空间割裂下依然实现教学产能最大化”。当重庆某高职院校教务主任在2024年全市信息化大会上展示其排课管理系统输出的《跨校区教师通勤热力图》时,台下响起的不是掌声,而是此起彼伏的笔记本开盖声——所有人都在急切地复制粘贴那段关键配置:spring.shardingsphere.rules[0].tables.classroom.actual-data-nodes=ds-$->{0..2}.classroom_$->{0..2}。
本站部分内容及素材来源于互联网,由AI智能生成,如有侵权或言论不当,联系必删!