从单体到云原生,我在实验室项目里把服务器干崩的那一夜
现在是晚上十一点半,我盯着监控面板上平滑上升的CPU曲线,手心出汗——明天要给导师演示的项目,刚上线五分钟就快撑不住了。
我是上海某211软件工程研二的学生,研究方向是分布式,但实验室管理系统一直是单体架构,Spring Boot + MySQL跑在一台老旧CentOS服务器上,启动要两分钟,每次部署都得半夜搞。
不是我想改,是线上炸了
产品经理要求加AI评测功能:学生提交代码后,调用通义灵码API做代码审查,再用DALL-E生成成绩海报。压测模拟100人同时提交,数据库连接池直接打满,MySQL慢查询跑8秒多。通义灵码API超时后,整个请求线程阻塞,服务器负载飙到40多,SSH都连不上,只能硬重启。
师兄说:“要不你重构一下?正好练手。”
拆服务,先摸底
我先用Linux命令分析资源:
free -h # JVM堆占3.2G,系统总共8G
top -c # Java进程最耗CPU
vmstat 1 5 # 上下文切换每秒两万多次
必须按业务边界拆成三个服务:用户管理、作业提交、AI评测。AI评测是IO密集型,必须独立出来做异步处理。
上K8s踩坑
装了个单节点Kubernetes。第一个坑是容器镜像:用openjdk:11-jre-slim打包,通义灵码SDK依赖glibc库,容器起不来,换成完整版openjdk:11-jre才解决。
第二个坑是服务间调用。拆开后走REST API,网络延迟从纳秒变毫秒。DALL-E生成慢导致超时重试三次,扣了三次API费用。后来加RocketMQ解耦:作业提交后发消息,AI评测服务异步消费。即使AI服务挂了,也不影响提交功能。
AI评测设计细节
通义灵码返回结构化JSON,包含代码规范、潜在bug等维度。我设计了评测模板表:
CREATE TABLE evaluation_template (
id BIGINT PRIMARY KEY,
name VARCHAR(100),
rules JSON COMMENT '评分规则'
);
DALL-E根据成绩等级生成不同风格海报,上传OSS返回CDN链接。上线后AI评测平均响应时间从12秒降到3秒,系统QPS从50提升到300。
写在最后
这次重构让我体会到,云原生核心是弹性伸缩、故障隔离、可观测性,而不只是上K8s。虽然CI/CD还是半自动,监控只有Prometheus+Grafana基础配置,但K8s滚动更新让我终于不用半夜部署了。这个项目经验正好用于秋招面试。

评论 0