ACM在線判題系統(OJ)判題接口,對外提供HTTP POST請求

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的配置,打包成一個鏡像實在有些牽強,還是自己配置方便得多。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章