面经 - 基于Linux的高性能在线OJ平台

==========================================

真实面试环境中,被问到的相关问题,感兴趣的可以看下

==========================================

1. 这个项目是你独立完成的吗?团队中你的职责是什么?

是的,这个项目是我独立完成的,从需求分析系统设计项目部署都我做的。重点工作包括:

  • 使用 C++ 编写判题核心模块,实现对用户代码的编译、运行,判题功能
  • 搭建了一个简单的 Web 界面,支持题目提交、实时查看运行的结果
  • 也使用 MySQL 管理题目与提交记录,用makefile脚本完成自动化部署

2. 这个项目的主要目标是什么?为什么要做这个项目? 

  • 主要目标是搭建一个高性能稳定安全的在线评测系统,用于自动评判编程题的提交结果,支持多人并发提交
  •  做这个项目的初衷,一方面是出于我对算法系统编程的兴趣,另一方面我也想通过实践锻炼自己在 Linux 系统编程和 C++ 开发方面的能力,所以我就做了一个基于Linux的高性能在线OJ平台

3. 项目用了哪些技术?为什么选这些技术?

  • C++ STL 标准库,

  •  Boost 标准库,对文件路径,文件名字符串进行分割,和根据需要拼接字符串

  • ctemplate第三方开源前端网页渲染库,为了将我们的题目信息显示在网页上
  • jsoncpp 第三方开源序列化、反序列化库,因为对用户提交的请求进行解析时,数据格式应该是json的,如果我手动拼接字符串不仅繁琐、易错,还不利于维护。而 jsoncpp 提供了清晰的 API,可以快速构建、解析 JSON 数据结构,提升开发效率,代码也更稳定易读
    jsoncpp 是跨平台的,开源、轻量,能很好地与 C++ 项目集成,也避免了自己重复造轮子。

  •  Ace前端在线编辑器,是为了提供一个高亮、自动缩进、语法提示友好的在线代码编辑环境,提升用户在 OJ 平台上的编程体验。
    对于普通的纯文本,Ace 支持多种语言语法高亮(如 C++、Python)、自动补全主题切换

        这个项目也考虑到了多进程,多线程的场景,其中网络库cpp-httplib就是多线程的,也进行了加锁解锁处理 

  • MySQL C connect,为了将题目信息,用户记录存入mysql中

2. 架构与设计类 

1. 项目的整体架构是怎样的?你是怎么参与设计的?

  • 首先设计了项目的宏观结构,两个大模块,CompileServer模块提供了对提交的代码进行编译的服务,OJServer模块提供在线OJ服务,
  • 我在设计CompileSever服务时,先设计编译模块,再设计运行模块,最后在进行了编译运行,其中引入了第三方库cpp-httplib,用来发起http和接受http请求,其中数据的发送和接受都使用了json进行序列化/反序列化
  • 设计OjServer的时候,使用了MVC模块,其中oj_mode管理数据的存储,以及对外提供接口,oj_view引入了ctemplate第三方库进行网页渲染,本质就是key-value之前的替换,
    oj_central是这个服务的核心,
    负载均衡调度,就是加权遍历所有的主机,并找到最小负载主机,进行服务,它会提供3个接口,一个是得到所有题目,一个是得到某个题目的详细信息,最后就是判题功能
  • 之后设计前端服务时,使用了第三方插件ACE一个编写代码的编译框,后用了JQuery获取html中的内容,构建json,通过类似信号槽机制借助ajax向后台发起基于http的json请求,并实现前后端交互
  • 最后引入了mysql数据库,借助第三方工具Navicat 连接数据库,存储题目数据,替换之前文件版的存储数据

2. 模块之间如何解耦?怎么处理模块间通信? 

模块解耦方式:

通过 HTTP 接口进行通信

  • OJServer 作为主服务,通过 HTTP 请求调用 CompileServer 暴露的编译接口(REST API)
  • CompileServer 编译完成后返回标准化 JSON 数据(包括编译是否成功、错误信息、可执行文件路径等)
  • 这样设计,两个模块通过标准协议通信,无需强依赖对方内部结构,解耦良好。
  • 我也定义了统一的数据结构(使用 jsoncpp 处理 JSON)(所有错误、状态都用统一的错误码和消息返回,方便主模块统一处理)

通信流程(举例) 

  • 用户提交代码后,OJServer 将其打包为 JSON 请求,发送到 CompileServer
    CompileServer 编译后将结果(是否成功、错误信息、可执行路径)通过 HTTP 响应返回给 OJServer,OJServer 再进入执行与判题流程。 

3. 用到了什么设计模式?为什么用? 

单例模式

使用场景

  • 项目中的日志模块配置加载模块使用了单例模式,确保全局只有一个实例,节省资源并统一管理。 

为什么用: 

  • 日志系统或配置对象需要被多个模块频繁调用,但又不希望重复创建,单例模式能保证线程安全的同时节省资源 

3. 测试与部署类

1. 项目是怎么测试的?有没有写自动化测试? 

我在项目开发过程中有进行接口测试,主要使用 Apifox 工具对 OJServer CompileServer 暴露的接口进行了自动化测试

  • 提交不同语言、正确与错误的代码,验证编译结果是否准确返回 
  • 测试如代码为空、非法语言类型、编译失败等边界情况 
  • Apifox 批量模拟多用户并发提交,观察系统响应和稳定性

为什么使用 Apifox: 

  • Apifox 支持接口文档、调试和自动化测试一体化 
  • 主要也有使用简单的特点 

是否写了测试代码: 

  •  编译模块核心逻辑(如 CompileTask)我也写了部分单元测试代码,验证编译参数拼接、错误码返回逻辑是否正确。

2. 怎么部署上线的?本地/服务器端用了什么环境? 

项目最终部署在 Linux 服务器上运行,主要采用的是手动部署 + 可执行文件运行的方式。

  • 使用 Makefile 编译生成 compile_server oj_server 可执行文件

  • 我在服务器上通过 ./compile_server 8081 直接启动编译服务,监听 8081 端口
    同理,./oj_server 8081 模块也监听一个独立端口,并启动在线OJ服务

为什么这样部署: 

  • 相较于复杂的容器部署,这种方式简单高效,便于调试与快速上线,同时也适合我的项目开发阶段。 

4. 反思与改进类 

1. 如果重新做一次,有什么地方你会改进?

使用 Docker替代手动项目部署

  • 之前项目是通过 手动部署 + 可执行文件运行的方式
  • 其实可以使用Docker 容器进行项目的部署,会更安全,
  • 也会让每次提交自动创建临时容器执行代码,更安全、更易于资源回收和管理,
  • 也方便后期支持多语言环境

增加前端用户体验优化

目前前端使用的是 Ace 编辑器,功能上满足需求,但界面较为基础简单。如果重做,我会:

  • 加入代码运行状态的 loading 动画、历史提交记录

  • 支持自动保存代码草稿、键盘快捷提交

  • 整体 UI 使用 Vue 前端框架提升交互体验

  1. 基于注册和登录的录题功能
  2. 业务扩展:比如自己写个论坛,接入在线OJ中
  3. 把编译服务部署在docker中
  4. 将cpphttplib改成rest_rpc库
  5. 判断一道题目正确之后,自动下一道题目
  6. 将导航栏中的功能一个一个的都实现一下

2. 从这个项目中你学到了什么? 

  • 我掌握了 Linux 下的系统编程实践了 C++ 工程化开发熟悉了模块化设计、Makefile 构建、jsoncpp 第三方库集成等内容
  • 通过设计 CompileServerOJServer 两个模块,我学会了如何通过 HTTP + JSON 实现模块解耦与通信
  • 从开发、测试(用 Apifox 自动化测试)、部署上线(Linux 环境部署)、日志调试,我第一次完整地实践了一个后端服务从设计到上线的全过程

5. 技术细节类 

1. 你在项目中遇到过哪些技术难题?怎么解决的?

问题一:如何让这个OJ平台成为一个高性能的平台,支持用户的高并发访问

OJServerCompileServer 是完全解耦的,通过 HTTP 接口通信,可以分布式部署在不同机器上,便于资源调度独立扩展

我将编译模块(CompileServer)做成可水平扩展的独立服务,部署了多个后端编译节点,然后通过 负载均衡(如 Nginx / 自写调度逻辑) 将用户提交分发到不同主机进行编译,避免一个主机负载太高的情况

在我设计的这个负载均衡模块oj_server应该选择后端的负载最低的那个compile_server,

  • 具体的操作就是循环遍历,找到权重也就是负载最低的那个compile_server

如果要进一步提高效率的话,可以试试任务队列 + 线程池 实现异步处理用户提交,提升系统处理速度

问题二:测试运行模块时出现了死循环 

  • 一般的测试环境都是没什么问题的,
  • 但后来发现是恶意程序死循环了,不停消耗CPU资源 , 
  • 解决办法是:添加进一步的资源约束
  • 在json string数据中添加上资源限制(setrlimit)的属性 ,资源不足或cpu超时,导致OS终止进程,直接发送对应的信号终止的  

问题三:用户代码运行的安全隔离 

用户提交的代码是我无法控制的,比如死循环、恶意访问文件系统等。如果直接运行在服务器上,非常不安全,容易造成系统崩溃或泄露敏感信息。 

我采用了 fork + exec 启动子进程,让子进程进行判断,这样就不会影响原来的服务了,然后结合setrlimit() 控制 CPU 时间、内存、文件大小,主要目的就是代码在受限环境中运行

2. 性能优化做过吗?具体做了哪些优化?效果如何? 

原先编译和输出结果都写入临时文件,I/O 开销较大。

优化

  • 改用内存管道或共享内存传递编译输出 / 执行结果

  • 减少中间文件写入次数,仅必要时存入磁盘文件中,

3. 你个系统,最多支持多少并发访问量 

        在实际开发阶段,我用 Apifox 模拟了多用户并发提交代码的场景,虽然没有用专业压测工具,但结合测试结果和架构设计,我估算当前系统可以稳定支持 100~200 个并发请求。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/92611.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/92611.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ubuntu 20.04 上安装 SPDK

以下是在 Ubuntu 20.04 上安装 SPDK (Storage Performance Development Kit) 的完整步骤:1. 系统准备# 更新系统 sudo apt update sudo apt upgrade -y# 安装基础依赖 sudo apt install -y git make gcc g libssl-dev libaio-dev libnuma-dev \pkg-config python3 p…

解决WPS图片在Excel表格中无法打开

若出现无法打开的情况,还请回到WPS中,点击图片,右键:转化为浮动图片保存,然后便能正常打开!

【Ollama】open-webui部署模型

目录 一、本地部署Ollama 1.1 进入官网复安装命令 1.2 执行安装命令 1.3 验证是否安装成功 二、启动Ollama服务 三、运行模型 方法一:拉取模型镜像 方法二:拉取本地模型 四、使用Open WebUI 部署模型 4.1 创建虚拟环境 4.2 安装依赖 4.3 运行…

C#文件操作(创建、读取、修改)

判断文件是否存在 不存在则创建默认文件 并写入默认值/// <summary>/// 判断文件是否存在 不存在则创建默认文件 并写入默认值/// </summary>public void IsConfigFileExist(){try{// 获取应用程序的当前工作目录。string fileName System.IO.Directory.GetCurr…

基于阿里云平台的文章评价模型训练与应用全流程指南

基于阿里云平台的文章评价模型训练与应用全流程指南 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家&#xff0c;觉得好请收藏。点击跳转到网站。 1. 项目概述 1.1 项目背景 在当今信息爆炸的时代&…

AI 及开发领域动态与资源汇总(2025年7月24日)

AI 项目、工具及动态汇总 项目/产品名称核心功能/简介主要特点/亮点相关链接Supervision一个流行的计算机视觉工具库&#xff0c;用于加速计算机视觉应用的构建。模型无关&#xff0c;可与多种主流库集成&#xff1b;提供丰富的可定制标注工具&#xff1b;支持多种数据集操作和…

C专题8:文件操作1

1.C语言中的文件是什么?所谓文件&#xff08;file&#xff09;一般指存储在外部介质上数据的集合&#xff0c;比如我们经常使用的txt、bmp、jpg、exe、rmvb等等。这些文件各有各的用途&#xff0c;我们通常将它们存放在磁盘或者可移动盘等介质中。文件无非就是一段数据的集合&…

Opencv C# 重叠 粘连 Overlap 轮廓分割 (不知道不知道)

先上效果图一种基于凹陷检测重叠轮廓分割的方法这两个星期压力大的一批&#xff0c;心脏都给干得乱跳了&#xff0c;现在高血压心率不齐贫血。兄弟们保重身体啊。简单说下逻辑&#xff1a;前处理&#xff1a;的噼里啪啦我就不说了&#xff0c;根据样品来(灰度&#xff0c;滤波&…

CentOS7 安装 rust 1.82.0

CentOS7 安装 rust 1.82.0 我在CentOS7.9中安装rust遇到报错版本低&#xff0c;再升级版本的过程中遇到诸多问题&#xff0c;简单记录。 遇到的问题 提示版本低 centos7 安装 ERROR: Rust 1.75.0 or newer required.Rust version 1.72.1 was found.原因是 CentOS7 的默认的软件…

Compose 适配 - 键鼠模式

一、概念不止触摸交互&#xff0c;在 ChromeOS 或外接键鼠的设备上&#xff0c;需要考虑焦点、悬停、右键等操作逻辑。二、使用2.1 焦点使用 Tab 键来导航&#xff0c;改变边框以提供清晰的焦点指示器。Composable fun Demo() {val interactionSource remember { MutableInter…

征服 Linux 网络:核心服务与实战解析

在当今的IT基础设施中&#xff0c;Linux作为服务器操作系统的基石&#xff0c;其强大的网络功能是其不可或缺的优势。对于任何志在成为高级系统管理员或运维工程师的人来说&#xff0c;精通Linux网络配置与服务管理是核心竞争力。 与日常应用不同&#xff0c;Linux网络管理往往…

Spark 之 DataFrame

# foreach useFeatureDF.rdd.foreachPartition {iter => iter.foreach {row =>val userId = row.getAs[Int]

射频信号(大宽高比)时频图目标检测anchors配置(下)

书接上文&#xff1a; 射频信号&#xff08;大宽高比&#xff09;时频图目标检测anchors配置&#xff08;上&#xff09; 三、4090加成检测效果深度优化 在4090 24G专用显存加持下继续探究大宽高比目标检测的奥秘&#xff1a; Conda环境迁移至租的云服 在云服上第一次测试…

跨境支付入门~国际支付结算(区块链篇)

摘要Web3区块链技术架构解析&#xff1a;从底层共识到应用生态本文系统梳理了Web3作为稳定币基础设施的技术架构&#xff0c;采用"数字共和国"的比喻框架&#xff0c;将区块链技术分解为六大核心模块&#xff1a;宪法根基&#xff08;区块链层&#xff09;&#xff1…

Docker 私服

什么是 Docker 私服&#xff1f; Docker 官方的 Docker Hub 是一个用于管理公共镜像的仓库&#xff0c;我们可以从上面拉取镜像 到本地&#xff0c;也可以把我们自己的镜像推送上去。 但是&#xff0c;有时候我们的服务器无法访问互联网&#xff0c;或者你不希望将自己的镜像…

DeepSeek vs ChatGPT:谁更胜一筹?

新兴 AI 聊天机器人的崛起与挑战&#xff1a;对话模型发展观察近年来&#xff0c;生成式人工智能领域持续取得突破&#xff0c;聊天机器人作为其中的代表&#xff0c;广泛应用于写作、编程、问答和信息处理等任务。2025 年初&#xff0c;国内某 AI 团队宣布了多项模型技术进展&…

飞算科技:以原创技术为翼,赋能产业数字化转型

在数字经济浪潮席卷全球的当下&#xff0c;一批专注于技术创新的中国企业正加速崛起&#xff0c;飞算数智科技&#xff08;深圳&#xff09;有限公司&#xff08;简称 “飞算科技”&#xff09;便是其中的佼佼者。作为一家国家级高新技术企业&#xff0c;飞算科技以自主创新为核…

电商接口什么意思?

“电商接口”这四个字&#xff0c;在中文互联网上出现的频次越来越高&#xff1a;商家后台、小程序、ERP、数据大屏……几乎任何与线上零售沾边的场景都会提到它。然而&#xff0c;对大多数刚进入电商行业的新人&#xff0c;甚至一些已经开了很多年网店的老板来说&#xff0c;这…

前端面试专栏-前沿技术:30.跨端开发技术(React Native、Flutter)

&#x1f525; 欢迎来到前端面试通关指南专栏&#xff01;从js精讲到框架到实战&#xff0c;渐进系统化学习&#xff0c;坚持解锁新技能&#xff0c;祝你轻松拿下心仪offer。 前端面试通关指南专栏主页 前端面试专栏规划详情 跨端开发技术&#xff08;React Native、Flutter&am…

复盘—MySQL触发器实现监听数据表值的变化,对其他数据表做更新

文章目录 MySQL交换数据库表中两列的值(额外的知识) 为防止后面有疑问,提前解释为什么需要 `$$` ? 第一版需求 第二版需求 第三版需求 注意事项: 存在的严重问题 最终版 关键修复说明: 完整测试场景: 额外建议(如果需要显式处理NULL): COALESCE函数 业务中出现的问题…