項目
- 項目(重點)
- 問題1:描述在網頁中題目點擊提交后到題目結果出現的一系列后臺反應
- 【1】如何獲取到用戶提交的代碼的?
- 【2】_1. 題目細節都有哪些?
- 【2】_2. 題目信息怎么存儲的?
- 【3】負載均衡算法的實現?
- 【4】oj_server怎么連接對應的compile_server(編譯主機)的?
- 【5】oj_server怎么把最終結果返回給客戶端?
- 問題2:HTTP底層網絡層是如何進行交互的?
- 問題3:這個項目超時或者占用內存過多報錯機制如何實現的?
- 問題4:介紹一下這個項目
- 問題5:做這個項目過程中遇到的挑戰
項目(重點)
問題1:描述在網頁中題目點擊提交后到題目結果出現的一系列后臺反應
先簡要概述:
- 請求接收和處理
- 用戶的提交請求通過HTTP發送到oj_server服務器
- OJ服務模塊接收請求并獲取到用戶提交的代碼【1】,調用控制模塊進行處理
- 代碼拼接
- 控制模塊調用model模塊獲取題目細節【2】,再將用戶提交的代碼和測試用例代碼進行拼接(以JSON字符串進行拼接)
- 選擇負載最低的主機編譯運行代碼
使用RR輪詢算法【3】選擇負載最低的主機,連接對應主機進行編譯運行服務【4】,得到結果后返回給oj_server,oj_server再返回給客戶端【5】
【1】如何獲取到用戶提交的代碼的?
通過http的post請求拿到包含用戶代碼(body(josn字符串))的響應正文,響應正文實際上就是一個結構體,再直接用結構體對象直接訪問對應的body【這里的body是json字符串】,將body反序列化后就能得到用戶代碼了
注:(httplib庫的json就是string)
【2】_1. 題目細節都有哪些?
- 題目的編號,唯一
- 題目的標題
- 難度:簡單,中等,困難
- 題目的描述
- 題目預設給用戶在線編輯器的代碼
- 題目的測試用例,需要和header拼接,形成完整代碼
- 題目的時間要求(s)
- 題目的空間要求(kb)
【2】_2. 題目信息怎么存儲的?
使用數據庫進行存儲的,是以題目的編號為主鍵(number)建的一個題目表
【3】負載均衡算法的實現?
算法類型:基于RR輪詢算法。
核心邏輯:
-
遍歷所有在線主機,找到當前負載最小的主機。
-
將請求分配給負載最小的主機。
-
更新主機的負載計數。
在oj_control.hpp文件中,負載均衡算法主要由LoadBlancer類實現。
LoadBlancer類
// 可以給我們提供服務的所有主機// 每臺主機都有自己的下標。充當當前主機的idstd::vector<Machine> machines;//Machine是一個主機類// 所有在線的主機std::vector<int> online;// 所有離線的主機std::vector<int