Xây dựng Hàng đợi Công việc Video AI bằng TypeScript
Việc tạo video bằng AI không phải là một yêu cầu HTTP tiêu chuẩn. Người dùng gửi một prompt và các cài đặt. Kết quả sẽ mất vài phút để trả về.
Backend của bạn phải xử lý nhiều bước:
- Xác thực đầu vào.
- Tạo bản ghi công việc.
- Gửi công việc đến nhà cung cấp.
- Kiểm tra kết quả (polling).
- Xử lý lỗi.
- Hiển thị trạng thái cho người dùng.
Bạn nên sử dụng một hàng đợi (queue) và một lớp adapter. Điều này giúp ngăn chặn mã nguồn đặc thù của nhà cung cấp làm hỏng toàn bộ ứng dụng của bạn.
Định nghĩa một kiểu công việc cốt lõi để đóng vai trò như một bản hợp đồng sản phẩm (product contract).
type JobStatus = "queued" | "validating" | "running" | "delayed" | "succeeded" | "failed";
type VideoJob = {
id: string;
userId: string;
model: string;
prompt: string;
aspectRatio: "16:9" | "9:16" | "1:1";
durationSeconds: number;
status: JobStatus;
providerTaskId?: string;
outputUrl?: string;
errorCode?: VideoJobErrorCode;
};
Sử dụng một interface cho các nhà cung cấp của bạn. Điều này giúp logic của worker luôn gọn gàng.
interface VideoProvider {
submit(job: VideoJob): Promise<{ providerTaskId: string }>;
poll(providerTaskId: string): Promise<
| { status: "running" }
| { status: "succeeded"; outputUrl: string }
| { status: "failed"; error: unknown }
>;
normalizeError(error: unknown): VideoJobErrorCode;
}
Hãy tuân thủ các thực hành tốt nhất (best practices) sau đây cho quy trình làm việc của bạn:
Thực hiện các kiểm tra ít tốn kém trước. Xác thực prompt và thời lượng trước khi gọi các API đắt đỏ.
Sử dụng chiến lược polling. Triển khai một vòng lặp với thời gian chờ (delay) tăng dần.
Xử lý sự chậm trễ. Nếu một công việc mất quá nhiều thời gian, hãy chuyển nó sang trạng thái "delayed". Sử dụng một worker riêng biệt để kiểm tra các công việc bị trì hoãn sau đó.
Chuẩn hóa lỗi. Đừng bao giờ hiển thị lỗi thô từ nhà cung cấp cho người dùng. Hãy ánh xạ các lỗi kỹ thuật thành các thông báo dễ hiểu cho con người.
Ví dụ về thông báo cho người dùng:
- "queued": Video của bạn đang chờ để bắt đầu.
- "running": Video của bạn đang được tạo.
- "delayed": Quá trình này đang mất nhiều thời gian hơn bình thường.
- "moderation_rejected": Yêu cầu này không thể xử lý được.
Hãy coi việc tạo video AI như một hệ thống công việc (job system). Một hàng đợi ổn định và hệ thống phân loại lỗi rõ ràng sẽ giúp sản phẩm của bạn dễ bảo trì và mở rộng hơn.
Nguồn: https://dev.to/miao_cunhui_587ccddb6acc1/building-an-ai-video-job-queue-in-typescript-1349