1. 项目背景与核心需求
在在线判题系统(OJ)的架构设计中,编译运行服务是整个系统的核心组件之一。这个模块负责接收用户提交的代码,进行安全隔离的编译执行,并返回运行结果。我们团队最近重构的负载均衡OJ系统中,compile_server模块经历了三次迭代,最终形成了现在这个稳定高效的版本。
这个服务需要解决几个关键问题:
- 高并发场景下的资源分配与调度
- 不同编程语言(C/C++/Java/Python等)的混合编译环境支持
- 恶意代码的安全防护
- 执行过程的资源限制(CPU/内存/时间)
- 编译错误与运行时错误的精准捕获
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 系统架构设计
2.1 整体服务拓扑
我们的compile_server采用微服务架构,主要包含以下组件:
code复制[Load Balancer]
|
[Dispatcher] → [Queue Manager]
|
[Compiler Worker Cluster]
|
[Runner Worker Cluster]
|
[Result Aggregator]
这种设计将编译和运行两个阶段解耦,使得系统可以针对不同语言特性进行优化配置。比如Java程序需要更长的编译时间但运行较快,而Python则是即时解释执行。
2.2 核心工作流程
- 请求接收:通过HTTP API接收JSON格式的提交请求
- 任务分发:根据语言类型和当前负载情况选择worker节点
- 沙箱准备:为每个任务创建独立的Docker容器
- 代码编译:在隔离环境中调用对应语言的编译器
- 程序执行:使用ptrace等系统调用监控运行过程
- 结果收集:捕获标准输出、错误流和系统返回值
- 资源清理:销毁临时容器,释放系统资源
3. 关键技术实现
3.1 安全沙箱设计
我们采用Docker + cgroups的组合方案实现资源隔离:
bash复制# 示例容器启动命令
docker run --rm \
--cpus=1 \
--memory=512m \
--pids-lim
