ACM獨立判題服務
開源項目地址:github
可針對性的添加判題語言,或者修改判題細節
判題語言支持:
- GCC
- GNU C90
- GNU C99
- GNU C11
- G++
- GNU C++98
- GNU C++11
- GNU C++14
- GNU C++17
- Java 1.8
- python2.7
- python3.6
- JavaScript
- C#
- Ruby
- GO
判題接口
POST http://wangzhengyu.cn:8081/producer/judge.do
參數列表(json):
- 題目id(題目id爲本人數據庫指定題目id,指定後測試數據爲本人系統提供)
- 輸入樣例數組(自定義輸入樣例,輸入id之後忽略)
- 輸出樣例數組(自定義輸出樣例,輸入id之後忽略)
- 時間限制:ms
- 內存限制:kb
- 判題語言:上述語言列表1-14
- 源代碼
- callBack地址:爲put請求方式的地址
{
"proId":15
"input":["99 1","99 1","99 1"],
"output":["98","100\n","100"],
"timeLimit":1000,
"memoryLimit":65535,
"judgeId":1,
"src":"#include<stdio.h>\nint main()\n{\n\tint a,b,sum;\n\tscanf(\"%d %d\",&a,&b);\n\tsum=a+b;\n\tprintf(\"%d\",sum);\n\treturn 0;\n}"
"callBack" :"http://ip:port/demo/update.do?submitId=111"
}
判題採用異步回調更新函數,網站服務器將判題任務和該id提交給判題服務器,判題服務器判題結束自動調用回調函數攜帶判題結果。
如上述任務會將結果返回到callBack的put接口中,網站服務器只需要指定一個PUT類型回調地址即可,參數submitId爲了分辨是哪個任務的回調結果。
爲了回調接口安全,防止其他人篡改結果,建議外加一個密鑰:“callBack” :“http://ip:port/demo/update.do?submitId=111&key=1asdf112asdfasdf”,
由於這個接口地址由網站服務器指定之後發送給判題服務器的,所以只有這兩個服務器知道密鑰,所以其他人不能修改結果。
返回數據(json):
- 全局信息:編譯錯誤信息之類的,判題正常爲null
- 判題信息(按參數組數順序):
- 結果:
- 時間消耗
- 空間消耗
- 運行錯誤信息:運行正常爲null
{
"globalMsg": null,
"result": [
{
"result": 4,
"timeused": 0,
"memoryused": 0,
"errormessage": null
},
{
"result": 1,
"timeused": 0,
"memoryused": 0,
"errormessage": null
},
{
"result": 0,
"timeused": 1,
"memoryused": 6896,
"errormessage": null
}
]
}
返回結果集:0 ~ 8
- ‘Accepted’
- ‘Presentation Error’
- ‘Time Limit Exceeded’
- ‘Memory Limit Exceeded’
- ‘Wrong Answer’
- ‘Runtime Error’
- ‘Output Limit Exceeded’
- ‘Compile Error’
- ‘System Error’
項目整體架構
- 一個判題接收服務:運行在真實服務器上
- kafka消息隊列:保存判題任務,讓下游服務消費
- docker虛擬服務:運行判題服務消費判題任務,多臺負載均衡
打包
原本想將項目打包成一個鏡像的,但是考慮到kafka的配置,打包成一個鏡像實在有些牽強,還是自己配置方便得多。