Bỏ qua để đến nội dung
Knowledge Hub

Thiết kế: upload ảnh và video bài giảng 2 GB Trung cấp

Thời gian đọc ước tính: 1 phút

Video bài giảng 2 GB đang đi xuyên qua Node.js API, nằm trên disk của pod và được transcode ngay trong request. Bảng trống là hệ thống hiện tại; kéo thành phần vào bốn tầng để thay từng đường đi: upload, lưu trữ, xử lý, phát.

  • Mục tiêu: đạt mọi yêu cầu trong ngân sách độ phức tạp.
  • Thử thêm: tìm một thiết kế dùng signed cookie và một thiết kế dùng signed URL. Rồi thử nâng timeout ALB thay vì bỏ đường proxy, hoặc thay worker bằng Lambda, xem chỉ số nào đỏ.
Thiết kế

Thiết kế upload ảnh và video bài giảng 2 GB

Giáo viên upload video bài giảng (tới 2 GB) và ảnh. Hiện tại: Node.js API nhận nguyên file, ghi vào disk của pod, chạy ffmpeg ngay trong request, rồi chính API pod phát video cho học viên. Kết quả: ALB trả 504, pod hết RAM và disk, deploy xong mất file, học viên ở xa chờ mãi mới thấy hình.

API (3 pod, Singapore) và PostgreSQL đã có. Bảng trống chính là hệ thống hiện tại; bạn thêm thành phần để thay từng đường đi: upload, lưu trữ, xử lý, phát.

Giả định để chơi: cao điểm 40 upload đồng thời, uplink giáo viên ~20 Mbps nên 2 GB mất ~14 phút; video dài 60 phút; 3.000 học viên xem cùng lúc buổi tối, một phần ở Úc và Mỹ. Số mất/kẹt tính trên 1.000 video trong một tháng có ~20 lần deploy. Số liệu minh hoạ, không phải benchmark.

Yêu cầu

  • Upload 2 GB thành công ≥ 99%
  • API không giữ kết nối dài nào cho upload hay phát video
  • 0 video mất hoặc kẹt / 1.000
  • Từ lúc upload xong tới lúc xem được ≤ 20 phút
  • Khởi động video p95 cho học viên ở xa ≤ 2 s
  • 0 đường để người ngoài xem bài giảng trả phí
  • Độ phức tạp ≤ 12 đơn vị

Bấm + Thêm ở từng tầng để chọn thành phần. Trên máy tính có thể kéo thành phần thả vào tầng. Chỉ số cập nhật ngay.

Chạm một thành phần để xem nó làm gì.

Người dùng Client
Trình duyệt & CDNLogic upload phía client, CDN trước storage
Lesson API Lesson API (3 pod)🔒
Lưu trữ PostgreSQL🔒
Xử lý nềnQueue và worker chạy ngoài request
Kết nối dài trên API3.040
Upload 2 GB thành công40 %
Video mất/kẹt / 1.00090
Upload xong → xem được35 phút
Khởi động video p955 s
Đường lộ nội dung riêng0
Độ phức tạp0 đv
  • Upload vẫn đi qua Node.js như hiện tại: 40 upload đồng thời giữ 40 connection dài, request > 5 phút bị Node cắt (requestTimeout mặc định 300 s). Chỉ ~40% upload 2 GB thành công.
  • File nằm trên disk của pod (emptyDir hay disk node): pod bị xoá hay dời node khi deploy là file mất; file chỉ có trên 1 trong 3 pod nên 2 pod kia trả 404. Giả định ~30/1.000 video mất mỗi tháng.
  • ffmpeg trong request handler: upload xong, request im lặng ~30 phút chờ transcode, ALB không thấy byte nào quá 60 s (idle timeout mặc định) thì trả 504. CPU pod bị ffmpeg chiếm, request khác chậm theo.
  • Video phát từ API pod: 3.000 học viên giờ cao điểm giữ 3.000 stream qua 3 pod ở Singapore. Học viên ở Úc, Mỹ chờ ~5 s mới thấy hình.

Vì sao đẩy file lớn qua Node.js tốn RAM và giữ connection, và stream giúp được tới đâu: Stream và backpressure.