4个年级本科生“同台竞技”,万人同时在线,2秒钟内就产生了约1700条选课记录,1分钟便达到47763条选课记录,稳如泰山,丝般顺滑。
东南大学选课系统自上线18年以来,使用金智选课系统共开展选课40余次。覆盖业务广泛,包括正选、重修、辅修、本研互选等多种场景,为学校师生提供稳定、顺畅的选课体验。自18年第一次服务两个年级约8000+学生选课,到2021年12月本轮选课增长到四个年级16000+学生同时在线选课,金智教育的选课系统都表现稳定。特别在本次选课中,在线峰值人数达到14000+人,2分钟内就产生了约47000+条选课记录。从监控数据看,单台选课服务器的请求数达到峰值约14000次/分钟,常规刷新页面平均耗时20ms,而选课更只实现10ms以内完成,你眨一次眼,我选了20门课。
1、自定义压缩算法,防止网络阻塞
为了提升选课服务的处理速度,减少前后端通信数据量,降低带宽要求,将选课所需数据放入内存进行处理计算是最优途径,金智新版系统在压缩算法上采用了三个解决方案:
首先,减少本身对象的大小,独创了开发态与运行态压缩算法。通过减少key的大小能很大程度上缩减存储,兼顾开发态时key的取名不影响代码可读性,平衡二者,采用nutzJson序列化的方式。
其次,由于学生和教学班的基数庞大,为了保存二者的关系独创了整数值压缩存储算法。
最后,数据分片,将学生对象相关数据按照自定义HASH算法存储在不同的redis上,支持redis集群,将选课所有所需数据缓存,实现0db操作减少单个redis的压力。
2、优化系统架构,平滑毛刺与尖峰

利用lvs解决nginx单点问题,提升系统并发能力上限至50万。同时,新选课采用disruptor这个队列对选课第一分钟的巨大洪峰流量做削峰填谷处理,最大限度平滑了毛刺与剑锋。
3、避免选课事故,全面提升系统安全性
所有请求需要计算的数据都放置进内存,由其课容量的计算,选课课容量是控制一门课程只允许多少学生选课的界限,是一条红线,绝对不能出错。
超过课容量就会产生教学事故,同时又要保障课容量的计算效率,新版系统采用lua脚本的方式来控制课容量,既保障正确性又保障计算效率,利用lua脚本将选课时间统一集中在nginx服务器上,防止不同服务器之间的时间差异。
通过令牌桶算法通过nginx做限流操作,支持对ip、用户在单位时间内的非法请求做拦截。
4、7×24h,持续运维保障
为保障东大选课平稳流畅,金智工程师们从11月底,周末无休持续进行调优,每天工作到凌晨三点,不断优化,最终确认现有环境。
例如针对如何避免选课并发问题,选课前后投入40台服务器用于测试调优,根据每次的测试结果不断调整资源分配比例。在经过开发十余次的优化,最终确定基于21台服务器组成本次选课的服务集群,为本次选课成功奠定最坚实的基础。
另外针对系统架构,数据库和缓存,软件架构,参数调优,用户行为分析,性能监控等多方面为选课保驾护航。
