Job Queue + Polling : 비동기 요청의 동기적 인터페이스화
- 긴 작업을 요청함 (예: 대용량 비디오 인코딩)
- 클라이언트에게 job_id를 반환
- 실제 작업은 백그라운드 큐로 위임
- job_id로 상태 확인 (polling 또는 push)
- 완료되면 최종 결과를 가져감
1
2
3
4
POST /generate-video
Body: { "source": "url/to/video.mp4" }
→ Response: { "job_id": "abc123" }
2. 큐에 등록 (백엔드)
1
2
3
4
5
6
# 예: Celery
@celery.task
def process_video(video_url):
# long-running task
return "url/to/final/result.mp4"
3. 상태 확인
1
2
3
4
5
6
GET /job-status/abc123
→ Response: { "status": "pending" }
GET /job-status/abc123
→ Response: { "status": "completed", "result_url": "..." }
🔧 이 방식의 장점
| 항목 | 장점 |
|---|---|
| 사용자 응답 빠름 | 요청과 동시에 작업 시작, 사용자 입장에서 기다리지 않음 |
| 서버 부하 분산 | 워커(큐 처리기)가 따로 작업 처리 |
| 재시도 가능 | 클라이언트가 작업 상태를 polling 방식으로 확인 |
| 유연성 높음 | 다양한 비동기 작업 처리에 응용 가능 |
- 클라이언트는 job_id를 받은 시점에 **“확실하게 처리 시작됨”을 확인**
- 추후 상태를 polling 하거나 완료 시 push 받으면, 사용자는 그 결과만 **동기적으로 수신**
- 결과적으로 **“기다리지 않지만 처리 흐름은 동기적”**
🚧 실무에서 많이 쓰이는 구조
| 구성 요소 | 예시 |
|---|---|
| 큐 시스템 | Redis, RabbitMQ, Amazon SQS |
| 비동기 워커 | Celery, RQ, Bull (Node.js), Hangfire (.NET) |
| 결과 저장소 | DB, 파일 스토리지, Redis cache 등 |
| 상태 확인 API | /jobs/{id}, /status/{job_id} 등 REST 방식 |
- 클라이언트가 job_id로 polling 하지 않고,
- SSE나 WebSocket 연결로 **“작업 완료” 이벤트를 push 받는 구조**도 가능합니다.
- 이러면 **“완전히 비동기 + 실시간 UX”도 구현 가능하죠.**
🧭 요약
“긴 작업은 큐에 넣고, job_id를 동기적으로 주며, 실제 결과는 비동기로 나중에 가져오게 하자.”
이 구조는 비동기 처리의 **UX 상의 일관성 확보**와 **서비스 안정성**을 동시에 가져가는 패턴입니다.
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.
