[Open Source] #109 - Ganymede: Hệ thống lưu trữ Twitch VOD và Live Stream quy mô lớn với Go, Next.js và kiến trúc Worker-Queue bền bỉ
Trên nền tảng Twitch, các video phát lại (VOD) thường bị xóa tự động sau 7 đến 60 ngày, gây thất thoát những nội dung giá trị của các nhà sáng tạo. Ganymede ra đời như một giải pháp lưu trữ (archiving) tự thân mạnh mẽ, cho phép người dùng tự động tải xuống, quản lý và phát lại các buổi livestream với đầy đủ dữ liệu Chat, Metadata và Chapters như đang xem trực tiếp trên Twitch.
Dưới góc độ kỹ thuật, Ganymede là một bài học mẫu mực về việc xử lý các tác vụ tiêu tốn tài nguyên (I/O & CPU) thông qua mô hình Worker-Queue và sự kết hợp giữa hiệu năng của Go cùng sự linh hoạt của Next.js.
Github: https://github.com/Zibbp/Ganymede
🛠️ 1. Nền tảng công nghệ: Sự kết hợp giữa Type-safety và Performance
Ganymede tận dụng tối đa các công nghệ hiện đại nhất trong hệ sinh thái Go và JavaScript để đảm bảo hệ thống vận hành trơn tru:
- Backend (Golang): Được sử dụng cho cả API Server và Worker. Go cung cấp khả năng xử lý đồng thời (Concurrency) tuyệt vời để tải xuống nhiều luồng video chất lượng cao cùng lúc mà không gây nghẽn mạch.
- Ent ORM: Một Entity Framework cực kỳ mạnh mẽ cho Go, giúp quản lý Schema database (PostgreSQL) dưới dạng "Type-safe", giảm thiểu tối đa lỗi truy vấn dữ liệu ở giai đoạn runtime.
- Frontend (Next.js & TypeScript): Xây dựng giao diện người dùng hiện đại, hỗ trợ Server-Side Rendering (SSR) giúp tối ưu hóa việc hiển thị danh sách hàng nghìn video.
- River Queue: Hệ thống quản lý hàng đợi tác vụ (Job Queue) dựa trên PostgreSQL, đảm bảo các công việc nặng như chuyển mã video hay render chat luôn được thực thi tin cậy, có khả năng tự động thử lại (retry) khi gặp lỗi mạng.
🏗️ 2. Trụ cột kiến trúc: Mô hình Server-Worker và File-first Persistence
Kiến trúc của Ganymede được thiết kế để chịu tải và bảo toàn dữ liệu lâu dài:
- Separation of Concerns (Tách biệt trách nhiệm): Hệ thống tách làm hai phần rõ rệt. API Server chịu trách nhiệm giao tiếp với người dùng và Twitch GQL; trong khi đó, Worker đảm nhận toàn bộ các tác vụ "nặng" (tải tệp, xử lý FFmpeg, capture IRC chat).
- File-first Philosophy: Thay vì phụ thuộc hoàn toàn vào Database, Ganymede tổ chức lưu trữ theo cấu trúc thư mục tiêu chuẩn. Video, Chat (JSON), Thumbnails và Metadata được lưu trữ sao cho ngay cả khi phần mềm không chạy, người dùng vẫn có thể truy cập dữ liệu qua các trình phát media thông thường.
- Multi-process Containerization: Sử dụng Supervisord bên trong Docker để quản lý đồng thời API, Worker và Frontend. Điều này giúp đơn giản hóa việc triển khai (deployment) chỉ với một câu lệnh
docker-compose upduy nhất.
🔄 3. Workflow: Vòng đời từ buổi Livestream đến kho lưu trữ (Sequence Diagram)
Sơ đồ dưới đây mô tả cách Ganymede tự động phát hiện và lưu trữ một buổi stream:

⚡ 4. Các kỹ thuật "Pro-level" trong mã nguồn
- Real-time Chat Replay: Ganymede không chỉ tải video; nó đồng bộ hóa dữ liệu chat đã lưu với mốc thời gian phát lại. Kỹ thuật này tái hiện hoàn hảo trải nghiệm tương tác của Twitch trong môi trường offline.
- Customized yt-dlp Integration: Dự án sử dụng các bản vá (patch) riêng cho
yt-dlpđể xử lý các thay đổi về Access Token của Twitch, giúp vượt qua các rào cản kỹ thuật mà các công cụ tải thông thường thường gặp phải. - Twitch IRC Capturing: Đối với các buổi Live, Ganymede kết nối trực tiếp vào giao thức IRC của Twitch để "bắt" từng dòng chat khi chúng vừa xuất hiện, đảm bảo tính toàn vẹn của dữ liệu kể cả khi VOD bị tắt chat.
- OIDC Authentication: Hỗ trợ tích hợp xác thực qua OpenID Connect (Authelia, Keycloak), cho phép quản lý quyền truy cập tập trung cho các hệ thống lưu trữ dùng chung trong cộng đồng hoặc gia đình.
⚖️ 5. So sánh chiến lược
| Tiêu chí | Ganymede | Twitch VOD (Mặc định) | Download thủ công |
|---|---|---|---|
| Thời gian lưu trữ | Vĩnh viễn (Tùy dung lượng đĩa) | 7 - 60 ngày (Bị xóa tự động) | Vĩnh viễn |
| Dữ liệu Chat | Lưu trữ đầy đủ & Replay | Có sẵn (Nhưng mất khi xóa VOD) | Thường không có |
| Tự động hóa | Hoàn toàn (Theo dõi 24/7) | Không cần làm gì | Phải làm thủ công mỗi khi có stream |
| Quyền sở hữu | Tuyệt đối (Self-host) | Phụ thuộc vào Twitch | Tuyệt đối |
✅ Kết luận: Tại sao Ganymede là tiêu chuẩn cho Twitch Archiving?
Ganymede chứng minh rằng việc xây dựng một hệ thống lưu trữ media không chỉ là câu chuyện về dung lượng đĩa cứng, mà là bài toán về quản lý tác vụ đồng bộ. Bằng cách sử dụng Go để xử lý dữ liệu thô và Next.js để trình diễn tri thức, dự án đã tạo ra một thư viện số bền vững cho các nhà sáng tạo và người hâm mộ.
Đối với các kỹ sư Backend, nghiên cứu Ganymede giúp bạn hiểu sâu về:
- Cách vận hành Worker-Queue pattern với cơ sở dữ liệu quan hệ.
- Kỹ thuật xử lý luồng Video Streaming và Chat data synchronization.
- Tư duy thiết kế hệ thống File-persistent kết hợp với DB Metadata.
All rights reserved