TypeScript로 AI 비디오 작업 큐(Job Queue) 구축하기
AI 비디오 생성은 일반적인 HTTP 요청이 아닙니다. 사용자가 프롬프트와 설정을 보내면, 결과가 도착하기까지 몇 분이 걸립니다.
백엔드는 많은 작업을 처리해야 합니다. 입력을 검증하고, 작업을 생성하며, 프로바이더(provider)와 통신하고, 결과를 폴링(poll)하며, 실패를 처리해야 합니다.
견고한 워크플로우를 위해서는 6단계가 필요합니다:
- 프롬프트와 설정 검증.
- 업로드된 에셋 확인.
- 데이터베이스에 작업 레코드 생성.
- 프로바이더에 작업 제출.
- 비디오가 준비될 때까지 프로바이더를 폴링.
- UI에 맞게 결과 포맷팅.
프로바이더 API가 앱 전체를 제어하게 두지 마세요. 시스템의 안정성을 유지하기 위해 어댑터 계층(adapter layer)을 사용하세요. 이렇게 하면 핵심 로직을 다시 작성하지 않고도 프로바이더를 교체할 수 있습니다.
제품 계약(contract) 역할을 할 중앙 작업 타입(job type)을 만드세요. 모든 프로바이더는 자신의 데이터를 이 형식으로 변환해야 합니다.
세 가지 메서드를 가진 VideoProvider 인터페이스를 정의하세요:
submit: 프로바이더에 작업을 전송합니다.poll: 작업이 완료되었는지 확인합니다.normalizeError: 프로바이더의 에러를 자체 에러 코드로 변환합니다.
이를 통해 프로바이더 간의 차이가 결제 로직이나 UI에 영향을 미치지 않도록 격리할 수 있습니다.
항상 비용이 적게 드는 체크를 먼저 수행하세요. API 호출에 비용을 쓰기 전에 프롬프트와 재생 시간을 먼저 검증해야 합니다.
워커(worker)를 구축할 때는 지연 시간을 점진적으로 늘리는 폴링 전략을 사용하세요. 작업이 너무 오래 걸리면 "delayed" 상태로 변경하세요. 작업이 영원히 "running" 상태로 머물게 해서는 안 됩니다. 나중에 이 지연된 작업들을 확인하기 위해 별도의 프로세스를 사용하세요.
UI에서 프로바이더의 가공되지 않은(raw) 에러를 그대로 보여주어서는 안 됩니다. 내부 에러 코드를 사용자가 이해하기 쉬운 메시지로 매핑하세요:
queued: 비디오 시작을 대기 중입니다.running: 비디오를 생성 중입니다.delayed: 평소보다 시간이 더 걸리고 있습니다.moderation_rejected: 프롬프트나 에셋을 변경해 보세요.provider_timeout: 프로바이더가 제시간에 결과를 반환하지 않았습니다.
명확한 메시지는 고객 지원 티켓을 줄여주고 사용자가 상황을 이해하는 데 도움을 줍니다.
AI 비디오를 하나의 작업 시스템(job system)으로 취급하세요. 안정적인 큐와 잘 정리된 에러 분류 체계(taxonomy)는 제품의 유지보수를 용이하게 만듭니다.
Source: https://dev.to/miao_cunhui_587ccddb6acc1/building-an-ai-video-job-queue-in-typescript-1349
Optional learning community: https://t.me/GyaanSetuAi