Technical Architecture

系统架构设计

ACMDOG 端云协同判题平台 · C/S 一体化架构,本地判题、云端同步、双后端存储

6核心模块
2桌面端 + 安装器
3C++ 动态库
2后端存储
01

项目定位

What & Why

ACMDOJ / ACMDOG 是一套 C/S 一体化 的算法竞赛判题平台,覆盖「命题 → 发布 → 判题 → 竞赛 → 榜单」全流程。核心判题与出题引擎由 C++ 动态库 承载,上层为 WPF 桌面客户端,存储采用 MySQL(权威)+ 远端 LSM(RESP KV 缓存) 双后端。

与 Web 型 OJ 不同,本项目判题在 本地完成(本地编译 + 运行 + 比对),云端专注题目分发、提交同步、比赛报名与榜单聚合,从而把评测算力从服务器下沉到每一台客户端。

02

技术栈

Technology Stack
C# / .NET 8(WPF) C++ / MSVC(P/Invoke) MySQL 8.0 远端 LSM(RESP / Redis 协议) HandyControl 控件库 Raft 共识引擎 RabbitMQ 消息队列 AES-256 加密
03

核心模块

Core Modules
💻

判题客户端 client

WPF 三层架构,登录注册、题目列表、做题、深色代码编辑、提交看结果。

🛠️

出题服务端 author

题目工作台、比赛管理、生成器管理、数据比对;支持并发编译。

🧩

共用库 shared

HandyControl 控件库源码 + OjEditorCore 编辑器核心(语法补全)。

📦

一键安装器 installer

自包含 exe,下载 + 安装 + 卸载三合一,免 UAC。

⚙️

判题核心 ojcore.dll

g++ 编译 → 限时运行 → 逐测试点比对 → 判定 AC/WA/TLE/RE/CE/SE。

🔗

出题核心 + Raft

authorcore.dll(编译/生成/发布)+ raftcore.dll(Raft 共识引擎)。

📨

消息队列中间层 RabbitMQ

生产者(鉴权+限流)→ topic 交换机 → 消费者(唯一连库),Python + C++ 双实现。

04

顶层架构

High-level Architecture
💻判题客户端 client
PresentationBusinessDataAccess
↓ P/Invoke
ojcore.dll(C++)判题引擎
🛠️出题服务端 author
PresentationBusinessDataAccess
↓ P/Invoke
authorcore.dllraftcore.dll(Raft)
⬇ HTTP POST(token 鉴权 + 限流)
📨消息队列中间层 RabbitMQ
生产者(鉴权+限流) topic 交换机 oj.exchange 消费者(唯一连库)
oj.upload oj.request Python / C++ 双实现
⬇ 落库
🔐中间层 HTTP 网关(C++)
鉴权 限流 防注入 AES 加密
⬇
🗄️MySQL 权威数据
⚡远端 LSM 共享 KV 缓存
05

消息队列中间层(RabbitMQ)

Message Queue Middleware

在客户端与后端数据库之间增加一层 RabbitMQ 消息队列,承担缓冲、转发、鉴权、限流,保证客户端永不直连数据库。

📤生产者 Producer
token 鉴权滑动窗口限流
🏭RabbitMQ
topic 交换机 oj.exchange
oj.uploadoj.request
📥消费者 Consumer
唯一连库组件ACK / 落库

两种实现(功能对齐)

版本目录依赖说明
Pythonmq/pikaproducer.py / http_producer.py / consumer.py
C++mq_cpp/AMQP-CPPproducer.cpp / consumer.cpp,poll() 手写事件循环

安全机制

机制说明
🔐 隔离客户端不直连数据库,只走队列 / HTTP 代理
🔑 token 鉴权非法 token 返回 401
🚦 限流滑动窗口,每 client 每分钟上限,超限 429
06

数据存储架构

Dual-store: MySQL + LSM

MySQL —— 权威存储

表用途关键设计
users账号SHA-256(salt+password),角色 admin/author/user
sessions登录会话token,7 天过期
submissions提交记录唯一键原地覆盖最新一版
contest_registrations比赛报名幂等,虚拟参赛标记
problems题目标程 AES-256 密文,is_public 发布开关
generators生成器全局库,源码密文
problem_generators题目↔生成器多对多关联
contests比赛配置contest.json 原文

远端 LSM —— RESP KV 缓存

提交记录与比赛报名走 Redis 协议 KV 存储,作为高速共享缓存:

submission:{id}→提交完整 JSON(含代码)
latest:{user}:{cid}:{pid}→最近一次提交 id
progress:{user}:{cid}→哈希 {题目id → 判定}
problem_subs:{pid}→哈希 {提交id → JSON}
contest_subs:{cid}→哈希 {提交id → JSON}
reg:{cid}→哈希 {用户名 → 报名 JSON}
meta:seq→自增提交序号
07

安全与工程机制

Security & Engineering
机制说明
🔐 鉴权写接口需 Bearer token,7 天过期
🚦 限流滑动窗口,按 IP 限速
🛡️ 防注入prepared statement + 转义
🔒 加密标程 / 生成器 AES-256-CBC 密文存储
🧂 密码安全SHA-256(salt + password),每用户随机盐
⚡ 并发DB 写操作 mutex 串行;编译同题串行 / 跨题并行
✅ Special Judgespj.cpp 自动启用,退出码 0 判通过
08

定位

Positioning

一个 架构完整、工程化规范的「中等体量」C/S 判题平台。核心闭环(命题 → 判题 → 竞赛 → 榜单)已落地,多端、双存储、安全机制、一键安装器齐全,并引入 Raft 共识引擎 为多节点出题端的一致性预留能力,工程成熟度较高。

返回首页 立即下载