JudgeMesh 是一个面向课程实践与答辩展示的分布式在线判题系统。系统以 Online Judge 业务为载体,覆盖用户认证、题目管理、代码提交、异步判题、比赛排行榜、可观测性和故障恢复等场景,用于展示高并发、高性能、高可用的分布式系统设计与实现。
系统采用前后端分离与微服务架构:
- 前端使用 React,提供题目、提交、比赛、排行榜和账户工作台。
- 后端使用 Spring Cloud Gateway 作为统一入口,负责 JWT 校验、路由和限流。
user-service负责用户注册登录、RBAC 权限和账户信息。problem-service负责题目、标签、测试用例 manifest 和对象存储元数据。submit-service负责提交记录、判题状态机、比赛报名、排行榜和 WebSocket 推送。judge-dispatcher负责消费 RabbitMQ 判题任务、选择 worker、处理超时重试和故障节点黑名单。judge-worker负责 C/C++/Java/Python 代码编译运行、输出比对和判题结果回写。- Redis 支撑排行榜与热点读缓存,MySQL 保存核心业务数据,MinIO 保存测试用例文件。
- etcd 用于 dispatcher 选主,Prometheus、Grafana、SkyWalking、Loki 用于可观测性建设。
- 多角色使用:游客、学生、出题人、管理员。
- 题目管理:题目创建、编辑、发布、标签维护和测试用例上传。
- 异步判题:提交先落库并进入消息队列,判题任务由 dispatcher 派发到 worker 池。
- 多语言执行:支持 C、C++、Java、Python 的编译运行与结果判定。
- 判题状态:覆盖 AC、WA、TLE、MLE、RE、CE、SE 等常见结果。
- 比赛与排行:支持比赛报名、实时排行榜、封榜和全局榜单。
- 分布式特性:RabbitMQ 削峰填谷、worker 池负载分担、etcd leader 选主、故障 worker 自动跳过与任务重派。
- 可观测性:通过指标、链路追踪、日志和 Grafana 大盘观察 QPS、延迟、AC 率和 worker 水位。
| 路径 | 说明 |
|---|---|
frontend/ |
React 前端应用 |
services/ |
Gateway、用户、题目、提交、调度器和 worker 等服务 |
infra/ |
Kubernetes、Helm、本地中间件和基础设施配置 |
migrations/ |
数据库迁移脚本 |
scripts/ |
数据导入、演示、压测和文档生成脚本 |
tests/ |
测试资源与测试脚本 |
docs/design/ |
需求、架构、服务拆分、数据模型、判题流水线、测试策略等设计文档 |
docs/dev/ |
本地联调、云部署、测试数据和接口对接文档 |
submit/ |
课程提交与答辩相关材料 |
项目根目录下放置了最终提交用 PDF:
| 文档 | 位置 |
|---|---|
| 软件需求说明书 | JudgeMesh 分布式在线判题系统-软件需求说明书.pdf |
| 概要设计说明书 | JudgeMesh 分布式在线判题系统-概要设计说明书.pdf |
| 测试分析报告 | JudgeMesh 分布式在线判题系统-测试分析报告.pdf |
| 汇报 PPT | JudgeMesh 分布式在线判题系统-汇报PPT.pdf |
docs/ 目录下同时保留了可编辑版本和导出版本:
| 文档 | DOCX | |
|---|---|---|
| 软件需求说明书 | docs/软件需求说明书.docx | docs/软件需求说明书.pdf |
| 概要设计说明书 | docs/概要设计说明书.docx | docs/概要设计说明书.pdf |
| 测试分析报告 | docs/测试分析报告.docx | docs/测试分析报告.pdf |
最终测试报告基于项目测试策略、测试数据文档和汇报 PPT 中的测试结果整理。核心结果包括:
- 提交接口同步阶段 P99 为 156 ms,满足 P99 < 200 ms 目标。
- 分布式端到端判题 P99 为 6418 ms,满足 P99 < 8 s 目标。
- 单 worker 故障恢复场景 P99 为 6895 ms,30 次请求全部 AC。
- 排行榜查询 P99 为 43 ms,题目详情查询 P99 为 87 ms。
- 关键压测与演示场景错误率为 0%,验证了 RabbitMQ 异步削峰、worker 负载分担、Redis 缓存和故障重分发方案的有效性。