注册一亩三分地论坛,查看更多干货!
您需要 登录 才可以下载或查看附件。没有帐号?注册账号
x
"""
Hacker cup competition (Online coding judge system)
* registered users
* contest has a start time and end time. (2-3 hrs)
* upon start, users get access to a certain # of problems (10)
* users submit a source code for a problem, in any order
* system validates the code and either accepts it or rejects it.
* ranking or a leaderboard.'
"""
- Requirments:
Registrations (V2):
register users (across globe) for a competitions (some previous... few current competitions)
online coding competition
Competition:
problems + test cases + critieria (memory/time etc) --> score
non-functional requirements:
- isolation
- scalability
- highly available
- durability
estimation:
- 1M users
storage:
10MB * 1M --> 10GB
Bandwidth:
1GB/sec
APIs
GET /problems
GET /problems/{problemId}
{
description:
case1:
case2:
}
POST /submit
/GET /leaderboard
-- users
-- registration
Datamodel:
problems
- problemid
- competitionId
- descritpion
users
- userid
- name
- contact
testcases
- problemId
- testcaseid
- input
- output
usersubmissions
- userid
- problemid
- code (BLOB) --> NoSQL
- status
- result
- memory
- time
-> submitted
testcaseResults
- problemId
- testcaseid
- output
- memory
- time
SQL
--> ACID
--> meets our scaling requirements
So choosing SQL instead of NoSQL
--> master-master for high availablility
backend components
- listservice --> storage
- submitservice --> storage
stores the code
calls evaluateService
- EvaluateSystemManager --> run the code against test cases
manages submissions
--> executors
--> heartbeat
--> asks for a job
--> executes a job
How does browser get notifications:
browser --> calling service (AJAX)
option1:
polling:
serverpush:
websocket:
Assuming that coders are submitting code in java
lang: java
Submit:
code
--> store code with status: NOT_STARTED
EvaluateSystemManager
--> 1 master (passive)
--> continously usersubmissions (look for NOT_STARTED) --> RUNNING --> COMPLETED
--> in-memory QUEUE
--> sends a msg to executor --> user-id, code, problem-id
--> list of nodes available to run --> SQL
--> maintain status of nodes --> SQL
Executor
connection to SystemManager
--> process--> heartbeat & status code --> EvaluateSystemManager
--> spins up a process
generate code
submitted-code
TEMPLATE-code
generate class
run-it
--> output --> communicates to SQL --> saves the data
--> event to compute
Leaderboard
--> users --> submitted
sort 'usersubmissions' by submited_time, cputime, memory asc
--> top 100 users in board
rank
--> gets stats of a particular user
--> get how many users ahead curr-user stats
leaderboard
--> uses websocket to update leaderboard
Feedback: need not be a web socket and results can be shown in eventual consistent manner. On very submission of code, leaderboard can change. it is compute intensitive to compute leaderboard for every submissions. Instead, this can be updated periodically. |