面經 - 基于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
英文地址,請注明出處:http://en.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函數 業務中出現的問題…