포스트

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 라이센스를 따릅니다.