이전 글 요약
- Redis를 사용한 웹 - 큐 - 워커 아키텍쳐
job 상태 다이어그램
job의 상태 정의
- PENDING: 아직 RUNNING이 아닌 상태
- RUNNING: 실제로 실행됨.
- COMPLETED: 실행이 완료됨. 코드의 결함은 사용자의 책임
- FAILED: 실행이 실패함. 시스템 설계의 책임.
Runtime Error는 COMPLETED일까 FAILED일까?
-> job실행 상태를 기반으로 정의하는 거지, 파이썬 코드의 성공 여부를 따지는 것이 아니므로 COMPLETED에 속함.
COMPLETED는 사용자의 책임, FAILED는 시스템 설계의 책임
stateDiagram-v2
[*] --> PENDING: Submit Job
PENDING --> RUNNING: Worker picks up
RUNNING --> COMPLETED: Execution finished
RUNNING --> FAILED: System error
COMPLETED --> [*]
FAILED --> [*]
api 설계
job의 상태 다이어그램을 기반으로 post와 get의 요청과 응답의 구성요소를 설계한다.
- response의 최소 구성 요소
- job_id, job_status는 항상 있어야한다. job_id가 있어야 job의 결과를 알 수 있고, job status가 있어야 현재 작업 상태를 알 수 있다.
POST /execute
request
- 필수적인 것: language, source_code
- 없으면 default로: input, limits(3초/128MB)
response
- 필수적인거 job_id, status(PENDING)
기본적인 의사코드
def execute(request): validate request create job id create execution worker_job for worker enqueue worker_job to redis queue create initial job state (PENDING) save job state in redis return job state as response (PENDING)- worker에게 갈 job의 정보(queue에 들어갈 정보)와 db에 저장해놓을 job 정보는 다르기 때문에 서로 분리해서 생각해야 한다.
- queue에 들어갈 정보는 코드, 입력, 제한 등등이 있지만, 해당 내용까지 db에 저장할 필요는 없다.
GET /jobs/{job_id}
- response
- job status에 따라 분리하여 설계
- PENDING/RUNNING
- 필수: job_id, status
- COMPLETED
- 필수: job_id, status, result(stdout, stderr, exit_code, execution_time_ms)
- FAILED
- 필수: job_id, status, reason(실패 사유)
- 의사 코드
def get_job(job_id): load job state from redis convert job state to json return job state as response