0. 목표
- Python FastAPI 기반의 서버리스 함수 실행 백엔드를 구현
- 모든 함수 실행은 큐(Queue) 를 통해 워커가 실행
- 함수 실행은 sync / async 모드를 모두 지원
- 대량 요청 환경에서도 견딜 수 있도록, DB 폴링 없이 Redis pub/sub 으로 상태 추적
1. 기술 스택 & 큰 그림
- 언어 / 프레임워크
- Python 3.x
- FastAPI
- (비동기)
asyncio
- 메시징
- Redis
- 작업 큐(exec_queue): Stream 기반 (워커가 XREAD로 소비)
- 콜백 채널(callback_channel): pub/sub 채널
- 서버리스 실행 환경
- General Runner (KNative Serving)
2. 컴포넌트 및 역할
- FastAPI 서버
- 엔드포인트:
POST /functions/{function_id}/invoke
GET /jobs/{job_id}
- Redis와 DB를 사용해서 Job을 생성/조회
- Redis pub/sub listener를 백그라운드로 돌려서 sync 호출을 깨움
- Redis
exec_queue: 실행 요청 큐(Stream)
- 메시지 포맷 :
{"job_id": "...", "function_id": "...", "payload": {...}}
callback_channel 채널: 완료 알림 pub/sub 채널
- 메시지 포맷 :
{"job_id": "...", "status": "SUCCESS"|"FAILED", "result": {...}|null, "error": "..."|null}
- Exec Worker
- 별도 프로세스로 실행
- Redis
exec_queue를 소비해서 실제 함수 실행 → DB 업데이트 → Redis callback_channel에 publish
5. Redis exec_queue & callback_channel 설계
5.1. exec_queue (작업 큐) — Redis Stream 사용
- 스트림 이름 :
"exec_stream"
- Consumer Group :
"exec_consumers"
- Worker별 consumer :
"worker-1", "worker-2" …