Giới thiệu dự án
Thị trường nhạc số trực tuyến (Digital Music Streaming) toàn cầu theo báo cáo của IFPI ghi nhận mức tăng trưởng vượt bậc với hơn 616 triệu người dùng trả phí và hàng tỷ lượt nghe mỗi ngày. Tại Việt Nam, nhu cầu thưởng thức âm nhạc số gắn liền với sinh hoạt thường nhật và giải trí tinh thần. Mặc dù các nền tảng lớn như Zing MP3, NhacCuaTui, Spotify hay SoundCloud đã định hình thói quen người dùng, phần lớn các dịch vụ nội địa hiện nay vẫn duy trì mô hình phân phối tập trung: chỉ có quản trị viên hoặc các đối tác bản quyền được phép xuất bản bài hát, biến người nghe thành đối tượng tiếp nhận thụ động thay vì một cộng đồng sáng tạo mở.
+-------------------------------------------------------------------------+
| VẤN ĐỀ TRỌNG TÂM |
+-------------------------------------------------------------------------+
| 1. Thiếu nền tảng mở cho phép nghệ sĩ độc lập (Indie) tự do chia sẻ |
| 2. Hạn chế về tính năng mạng xã hội tương tác 2 chiều (Follow/Chat) |
| 3. Kiến trúc REST API truyền thống gây lãng phí băng thông (Over-fetch) |
| 4. Khó khăn trong tối ưu hóa công cụ tìm kiếm (SEO) với SPA thuần túy |
+-------------------------------------------------------------------------+
Đồ án tốt nghiệp "Xây dựng hệ thống nghe và chia sẻ nhạc online" của sinh viên Lê Văn Thi (Khoa Khoa học & Kỹ thuật Máy tính / Hệ thống Thông tin, Trường Đại học Bách Khoa – ĐHQG-HCM) tập trung giải quyết bài toán xây dựng một mạng xã hội âm nhạc tương tác đa chiều. Đề tài không dừng lại ở việc nghe nhạc thông thường mà cung cấp sân chơi mở để mọi người dùng đều có thể tải lên tác phẩm cá nhân, kết nối trực tiếp với cộng đồng thông qua cơ chế thời gian thực.
Mục tiêu dự án
- Xây dựng nền tảng Web App hoàn chỉnh: Cho phép nghe nhạc, tải nhạc, phát trực tuyến và quản lý danh sách phát cá nhân hóa.
- Hiện thực hóa mạng xã hội âm nhạc tương tác mở: Hỗ trợ đăng tải bài hát (User Upload), bình luận phân tầng (nested comments), tương tác thích (like), theo dõi tác giả (follow/unfollow) và trò chuyện trực tiếp (real-time chat).
- Ứng dụng kiến trúc Full-stack JavaScript hiện đại: Kết hợp Next.js (Server-Side Rendering), NestJS (Modular Architecture & Dependency Injection), GraphQL API và MongoDB.
- Tối ưu hóa truyền tải và dữ liệu thời gian thực: Triển khai cơ chế Publish/Subscribe (PubSub) thông qua GraphQL Subscriptions cho hệ thống thông báo tức thời và tin nhắn.
- Xây dựng hệ thống quản trị nội dung (CMS/Admin): Kiểm duyệt bài hát, xử lý báo cáo vi phạm bản quyền và quản lý tài khoản người dùng tập trung.
Phương pháp tiếp cận và kết quả kỳ vọng
Giải pháp kết hợp mô hình Render phía máy chủ (SSR - Server-Side Rendering) của Next.js nhằm khắc phục triệt để nhược điểm SEO của React Single Page Application (SPA), kết hợp kiến trúc hướng dịch vụ với GraphQL để tối ưu hóa truy vấn dữ liệu.
- Chỉ số mục tiêu: Thời gian phản hồi API trung bình đạt dưới 120ms; thời gian hiển thị nội dung đầu tiên (FCP - First Contentful Paint) dưới 1.5 giây; hỗ trợ xử lý đồng thời > 1,000 kết nối socket thời gian thực cho tính năng chat/notification; tỷ lệ nén payload giảm ít nhất 40% so với REST API truyền thống.
- Phạm vi & Giới hạn: Hệ thống tập trung tối ưu hóa trên nền tảng Web; sử dụng hệ cơ sở dữ liệu phi quan hệ MongoDB; cơ chế xếp hạng dựa trên trọng số tương tác người dùng kết hợp hàm suy giảm thời gian (Time-decay ranking).
Phân tích và thiết kế giải pháp
Phân tích hiện trạng
Khảo sát thị trường các nền tảng streaming âm nhạc trực tuyến cho thấy sự phân hóa rõ rệt giữa mô hình chia sẻ mở và mô hình thương mại bản quyền đóng:
| Tiêu chí so sánh | Zing MP3 / NCT | Spotify | SoundCloud | Giải pháp đề tài |
|---|---|---|---|---|
| Quyền đăng tải tự do (User Upload) | Không (Chỉ Admin/Đối tác) | Không (Phải qua Distributor) | Có (Giới hạn dung lượng free) | Có (Hoàn toàn tự do cho User) |
| Mạng xã hội & Chat trực tiếp | Không | Hạn chế (Friend Activity) | Hạn chế (Comment dạng sóng) | Đầy đủ (Chat, Follow, Comment) |
| Giao thức API cốt lõi | RESTful API | Web API (REST) | REST API | GraphQL (Query, Mutation, Sub) |
| Cơ chế Rendering Frontend | CSR / Hybrid | Web Player (CSR) | CSR | SSR (Next.js) tối ưu SEO |
| Chi phí vận hành người dùng | Gói Premium / Quảng cáo | Trả phí hàng tháng | Gói Pro Unlimited | Miễn phí mã nguồn mở |
Phân tích yêu cầu hệ thống theo mô hình phân loại MoSCoW:
- Must Have (Bắt buộc): Trình phát nhạc Audio Controls (Play, Pause, Seek, Volume, Loop); Upload bài hát & Metadata; Xác thực người dùng qua JWT; Quản lý Playlist cá nhân; Tìm kiếm bài hát theo tên/ca sĩ; Hệ thống Dashboard Admin kiểm duyệt.
- Should Have (Nên có): Real-time Chat 1-1; Push Notifications thời gian thực khi có tương tác mới (Like, Comment, Follow); Bảng xếp hạng Trending theo thuật toán tương tác đa biến.
- Could Have (Có thể có): Phân loại danh mục theo Quốc gia, Thể loại; Nghe lại lịch sử phát; Trình xem trang cá nhân người dùng khác.
- Won't Have (Giai đoạn này): Xử lý chuyển mã âm thanh thích ứng theo băng thông (Adaptive Bitrate Streaming HLS/DASH); Engine gợi ý âm nhạc bằng học máy (AI Recommendation System).
Thiết kế hệ thống
Kiến trúc tổng thể được xây dựng theo mô hình phân tầng Layered Architecture (3-Layers) kết hợp với mô hình giao tiếp bất đồng bộ qua PubSub Pattern:
+-----------------------------------------------------------------------+
| PRESENTATION LAYER (Next.js / React) |
| - UI Components (Ant Design, SCSS) |
| - State Management (Redux Store, Apollo Client Cache) |
| - SSR Pages & GraphQL Resolvers Connector |
+-----------------------------------------------------------------------+
+-----------------------------------------------------------------------+
| BUSINESS LOGIC LAYER (NestJS / Node.js) |
| - GraphQL Modules (Queries, Mutations, Subscriptions) |
| - Service Classes (Auth, Track, Playlist, Chat, Ranking) |
| - Event Emitter & PubSub Engine |
| - Authentication Middleware (JWT Validation) |
+-----------------------------------------------------------------------+
+-----------------------------------------------------------------------+
| DATA ACCESS & STORAGE LAYER |
| - MongoDB Cluster (Document Collections: Users, Tracks, Playlists) |
| - File Storage Engine (Audio Binary / Media Files) |
+-----------------------------------------------------------------------+
Technology Stack và Phiên bản
- Frontend Framework: ReactJS v17.0.2 kết hợp Next.js v12.1.0 hỗ trợ Server-Side Rendering (SSR) và Client-Side Routing tự động.
- State & Data Management: Redux v4.1.2 quản lý UI state, Apollo Client v3.5.8 quản lý caching và GraphQL operations.
- UI Library & Styling: Ant Design (Antd) v4.18.0 tuân thủ Flat Design, kết hợp SCSS/SASS module hóa.
- Backend Framework: NestJS v8.2.5 xây dựng trên nền Node.js v16 LTS, hỗ trợ TypeScript thuần và Dependency Injection.
- API Protocol: Apollo Server Express v3.6.0 thực thi GraphQL Schema (Query, Mutation, Subscription).
- Database & ODM: MongoDB v5.0.6 (NoSQL Document Store), Mongoose v6.2.1 đóng vai trò Object Document Mapper (ODM).
- Bảo mật & Xác thực: JSON Web Token (JWT) theo chuẩn RFC 7519 với thuật toán mã hóa chữ ký HMAC-SHA256.
- DevOps & Packaging: Docker Engine v20.10.12 và Docker Compose v2.2.3 chuẩn hóa môi trường triển khai.
Thiết kế Cơ sở dữ liệu (MongoDB Document Schemas)
+-------------------+ +--------------------+ +--------------------+
| User | | Track | | Playlist |
+-------------------+ +--------------------+ +--------------------+
[Track Collection]
Methodology
Quy trình phát triển phần mềm áp dụng mô hình Agile/Scrum rút gọn với các sprint 2 tuần:
- Sprint 1 (01/01/2021 - 01/02/2021): Khảo sát nghiệp vụ, phân tích Use Case và thiết kế Schema dữ liệu / UI wireframe.
- Sprint 2 (02/02/2021 - 20/03/2021): Xây dựng Core Backend (NestJS, MongoDB) và cấu hình các Base Component (Next.js, Antd).
- Sprint 3 (21/03/2021 - 01/05/2021): Hiện thực hóa luồng tương tác: Upload nhạc, GraphQL Query/Mutation, tích hợp Audio Player.
- Sprint 4 (02/05/2021 - 01/06/2021): Xây dựng hệ thống Real-time (Chat, Push Notification) qua GraphQL Subscriptions và PubSub.
- Sprint 5 (01/07/2021 - 26/07/2021): Đóng gói Docker Container, kiểm thử tải, vá lỗi bảo mật và hoàn thiện báo cáo.
Implementation và kết quả
Development process
Cấu trúc dự án Backend phân tách tường minh theo mô hình Module của NestJS, đảm bảo tính đóng gói (encapsulation) và tái sử dụng:
src/
Thuật toán xếp hạng bài hát (Ranking Algorithm)
Để phản ánh chính xác độ phổ biến của bài hát mà không bị chi phối vĩnh viễn bởi các bài đăng cũ, hệ thống áp dụng thuật toán chấm điểm động kết hợp suy giảm thời gian (Time-decay function):
$$\text{Score}(T) = \frac{w_1 \cdot L + w_2 \cdot P + w_3 \cdot C}{(t_{\text{current}} - t_{\text{upload}} + 2)^\gamma}$$
Trong đó:
- $L$: Tổng lượt thích (
likesCount) – Trọng số $w_1 = 3.0$ - $P$: Tổng lượt nghe (
listensCount) – Trọng số $w_2 = 1.0$ - $C$: Tổng lượt bình luận (
commentsCount) – Trọng số $w_3 = 2.0$ - $t_{\text{current}} - t_{\text{upload}}$: Khoảng thời gian từ lúc tải lên tính theo giờ.
- $\gamma$: Hệ số suy giảm trọng lực thời gian (Gravity decay, mặc định $\gamma = 1.5$).
Code Snippet 1: Định nghĩa Track Schema bằng Mongoose & NestJS
import { Prop, Schema, SchemaFactory } from '@nestjs/mongoose';
import { Document, Types } from 'mongoose';
export type TrackDocument = Track & Document;
@Schema({ timestamps: true })
export class Track {
@Prop({ required: true, trim: true, index: true })
title: string;
@Prop({ required: true })
audioUrl: string;
@Prop({ default: 0 })
duration: number; // Thời lượng tính bằng giây
@Prop({ type: Types.ObjectId, ref: 'User', required: true, index: true })
uploader: Types.ObjectId;
@Prop({ default: 'VN', index: true })
country: string;
@Prop({ default: 0, index: -1 })
listensCount: number;
@Prop({ default: 0 })
likesCount: number;
@Prop({ default: [] })
tags: string[];
}
export const TrackSchema = SchemaFactory.createForClass(Track);
TrackSchema.index({ title: 'text', tags: 'text' }); // Hỗ trợ Full-text search
Code Snippet 2: GraphQL Mutation Resolver và cơ chế PubSub Notification
import { Resolver, Mutation, Args, Subscription } from '@nestjs/graphql';
import { Inject } from '@nestjs/common';
import { PubSubEngine } from 'graphql-subscriptions';
import { TracksService } from './tracks.service';
import { TrackType } from './dto/track.type';
import { UseGuards } from '@nestjs/common';
import { GqlAuthGuard } from '../auth/guards/gql-auth.guard';
import { CurrentUser } from '../auth/decorators/current-user.decorator';
const NOTIFICATION_TRIGGER = 'NEW_TRACK_NOTIFICATION';
@Resolver(() => TrackType)
export class TracksResolver {
constructor(
private readonly tracksService: TracksService,
@Inject('PUB_SUB') private readonly pubSub: PubSubEngine,
) {}
@Mutation(() => TrackType)
@UseGuards(GqlAuthGuard)
async createTrack(
@Args('title') title: string,
@Args('audioUrl') audioUrl: string,
@Args('duration') duration: number,
@CurrentUser() user: any,
) {
const newTrack = await this.tracksService.create({
title,
audioUrl,
duration,
uploader: user._id,
});
// Phát sự kiện thông báo thời gian thực qua PubSub
await this.pubSub.publish(NOTIFICATION_TRIGGER, {
trackNotification: {
message: `${user.username} vừa tải lên bài hát mới: ${title}`,
track: newTrack,
},
});
return newTrack;
}
@Subscription(() => TrackType, {
name: 'trackNotification',
})
subscribeTrackNotification() {
return this.pubSub.asyncIterator(NOTIFICATION_TRIGGER);
}
}
Testing và validation
Quá trình kiểm thử được triển khai trên môi trường giả lập tải với công cụ k6 và Artillery, đo lường khả năng chịu tải của GraphQL Server và hiệu quả bộ nhớ đệm:
| Kịch bản kiểm thử (Test Scenario) | Số lượng Concurrent Users | Tỷ lệ thành công (Success Rate) | Thời gian phản hồi trung bình (p95) | Thông lượng (Throughput) |
|---|---|---|---|---|
| Truy vấn danh sách bài hát (GraphQL Query) | 500 VUs | 100% | 45ms | 1,250 req/sec |
| Stream phát tệp âm thanh (Range Request) | 200 VUs | 99.8% | 85ms | 350 req/sec |
| Gửi tin nhắn Real-time (Subscription / PubSub) | 1,000 WebSockets | 99.9% | 28ms | 2,800 msgs/sec |
| Đăng ký / Xác thực người dùng (JWT Login) | 300 VUs | 100% | 110ms | 400 req/sec |
- Độ bao phủ kiểm thử (Test Coverage): Hệ thống đạt 78% code coverage đối với các module nghiệp vụ cốt lõi (AuthService, TracksService, RankingService).
- Khắc phục lỗi: Đã phát hiện và xử lý 14 lỗi logic trong quá trình ghép nối Apollo Client Cache và xử lý kết nối WebSocket bị rớt gói khi chuyển trang trong Next.js.
Kết quả đạt được
- Hoàn thành 100% các tính năng nghiệp vụ cốt lõi: Người dùng có thể nghe, tạm dừng, tua nhạc, quản lý playlist, tải lên và tải về bài hát trực tiếp.
- Tích hợp tính năng xã hội: Hệ thống theo dõi (Follow/Unfollow), bình luận phân nhánh, thả tim bài hát và phòng chat trực tuyến hoạt động ổn định.
- Hiệu năng vượt trội: Áp dụng cơ chế Server-Side Rendering của Next.js giúp điểm Google Lighthouse đạt 92/100 điểm cho hạng mục Performance và 95/100 cho SEO.
Đổi mới và đóng góp
- Ứng dụng Single-Endpoint GraphQL thay thế REST truyền thống: Loại bỏ hoàn toàn tình trạng thừa dữ liệu (Over-fetching) và thiếu dữ liệu (Under-fetching). Client chỉ cần định nghĩa chính xác các trường cần hiển thị (ví dụ: chỉ lấy
titlevàaudioUrlcho danh sách phát thu gọn), giúp giảm 45% kích thước gói tin truyền tải (Payload Size) so với REST endpoint chuẩn. - Mô hình hóa dữ liệu linh hoạt trên MongoDB: Thay vì cấu trúc bảng cứng nhắc của RDBMS, việc sử dụng Mongoose Document kết hợp Embedded Data (cho Tags, Lượt nghe) và Reference Data (cho User uploader, Comments) giúp tối ưu tốc độ đọc (Read-heavy operations) – vốn chiếm hơn 85% lưu lượng của ứng dụng nghe nhạc.
- Tích hợp cơ chế PubSub đa hướng: Tận dụng GraphQL Subscriptions trên cùng một Schema duy nhất để xử lý cả tin nhắn văn bản và thông báo sự kiện, loại bỏ sự cần thiết phải duy trì một máy chủ Socket.IO độc lập bên ngoài, giúp tiết kiệm tài nguyên máy chủ.
+-------------------------------------------------------------------------+
| SO SÁNH KÍCH THƯỚC DỮ LIỆU TRUY VẤN |
+-------------------------------------------------------------------------+
| REST API GET /api/v1/tracks (Trả về toàn bộ 28 trường) : 1.85 KB / req |
| GraphQL Query (Chỉ yêu cầu 5 trường hiển thị UI) : 0.98 KB / req |
| ==> Tiết kiệm ~47% băng thông mạng trên mỗi lượt tải danh sách |
+-------------------------------------------------------------------------+
Ứng dụng thực tế và triển khai
Hướng dẫn đóng gói và triển khai qua Docker
Hệ thống được đóng gói hoàn chỉnh bằng Docker Compose, giúp việc triển khai đạt chuẩn "Build once, run anywhere":
version: '3.8'
services:
mongodb:
image: mongo:5.0.6
container_name: music_mongodb
restart: always
ports:
- "27017:27017"
volumes:
- mongo_data:/data/db
environment:
MONGO_INITDB_ROOT_USERNAME: admin
MONGO_INITDB_ROOT_PASSWORD: secretpassword
backend:
build:
context: ./backend
dockerfile: Dockerfile
container_name: music_backend_api
restart: always
ports:
- "4000:4000"
environment:
PORT: 4000
MONGO_URI: mongodb://admin:secretpassword@mongodb:27017/music_db?authSource=admin
JWT_SECRET: super_jwt_secret_key_2026
depends_on:
- mongodb
frontend:
build:
context: ./frontend
dockerfile: Dockerfile
container_name: music_frontend_app
restart: always
ports:
- "3000:3000"
environment:
NEXT_PUBLIC_GRAPHQL_URI: http://localhost:4000/graphql
NEXT_PUBLIC_WS_URI: ws://localhost:4000/graphql
depends_on:
- backend
volumes:
mongo_data:
Chiến lược vận hành và Khả năng mở rộng
- Mở rộng theo chiều ngang (Horizontal Scalability): Tách biệt tầng Frontend (Next.js) và Backend (NestJS). NestJS có thể dễ dàng nhân bản thành nhiều worker nodes phía sau một Nginx Load Balancer hoặc Kubernetes Ingress.
- Xử lý tệp tĩnh (Media CDN): Trong môi trường sản xuất thực tế, các tệp âm thanh nhị phân (.mp3, .wav) được phân phối thông qua Object Storage (Amazon S3 / Google Cloud Storage) kết hợp mạng phân phối nội dung (Cloudflare CDN) để giảm tải hoàn toàn cho máy chủ ứng dụng.
Hạn chế và hướng phát triển
Hạn chế kỹ thuật
- Giao diện Responsive: Thiết kế Ant Design mặc định tối ưu tốt cho Desktop nhưng một số khung hiển thị danh sách bài hát và thanh điều khiển audio player trên màn hình di động cỡ nhỏ chưa đạt độ mượt mà tuyệt đối.
- Kiểm duyệt bản quyền âm thanh: Hệ thống hiện mới chỉ hỗ trợ kiểm duyệt thủ công qua quyền Quản trị viên (Admin Review) và Báo cáo vi phạm (User Report), chưa có thuật toán nhận dạng dấu vân tay âm thanh (Audio Fingerprinting) tự động.
- Cơ chế Streaming đơn luồng: Dữ liệu âm thanh đang được truyền tải dưới dạng tệp tĩnh nguyên bản thông qua HTTP Range Request thay vì phân đoạn thành các luồng HLS (HTTP Live Streaming) thích ứng với chất lượng mạng.
Hướng phát triển tiếp theo
- Nâng cấp kiến trúc Microservices: Tách riêng Module chuyển mã âm thanh (Audio Transcoding Service) và Module thời gian thực (Real-time Communication Service).
- Tích hợp Trí tuệ nhân tạo (AI Engine): Xây dựng hệ thống gợi ý bài hát cá nhân hóa dựa trên ma trận phân rã (Matrix Factorization) và phân tích tâm trạng bài hát qua phổ âm (Spectrogram).
- Phát triển Mobile App: Sử dụng React Native để chia sẻ đến 70% mã nguồn xử lý logic và Apollo Client có sẵn từ phiên bản Web.
Đối tượng hưởng lợi
+------------------+------------------------------------------------------+
| ĐỐI TƯỢNG | GIÁ TRỊ VÀ LỢI ÍCH ĐẠT ĐƯỢC |
+------------------+------------------------------------------------------+
| Sinh viên CNTT | Nguồn tài liệu tham khảo thực tế về Full-stack |
| | JavaScript, kiến trúc 3 lớp và triển khai GraphQL. |
+------------------+------------------------------------------------------+
| Lập trình viên | Bộ khung mẫu (Boilerplate) tích hợp chuẩn NestJS, |
| | Next.js SSR, Apollo Subscriptions và Docker Compose. |
+------------------+------------------------------------------------------+
| Nghệ sĩ độc lập | Kênh phát hành âm nhạc tự do, tiếp cận trực tiếp với |
| (Indie Artists) | người nghe mà không qua đơn vị trung gian phân phối. |
+------------------+------------------------------------------------------+
| Doanh nghiệp | Mô hình kiến trúc mẫu để phát triển các mạng nội bộ |
| | chia sẻ media hoặc ứng dụng tương tác thời gian thực.|
+------------------+------------------------------------------------------+
Câu hỏi thường gặp (FAQ)
1. Cấu hình phần cứng tối thiểu để triển khai hệ thống là gì?
Máy chủ triển khai (hoặc VPS) yêu cầu tối thiểu 2 vCPU, 4GB RAM, 20GB SSD lưu trữ và đã cài đặt sẵn Docker Engine cùng Docker Compose. Hệ điều hành khuyến nghị: Ubuntu 20.04 LTS / 22.04 LTS.
2. Tại sao đồ án chọn GraphQL thay vì RESTful API truyền thống?
GraphQL cho phép ứng dụng Web định nghĩa chính xác tập thuộc tính cần lấy từ một Endpoint duy nhất /graphql. Điều này loại bỏ hoàn toàn việc phải gọi liên tiếp 3-4 API REST để hiển thị một trang chi tiết bài hát (Bài hát, Tác giả, Bình luận, Bài hát liên quan), giúp giảm 40-50% số lượng request và tiết kiệm băng thông di động.
3. Hệ thống xử lý vấn đề đồng bộ thời gian thực cho Chat và Notification như thế nào?
Hệ thống sử dụng GraphQL Subscriptions được hỗ trợ bởi động cơ Apollo PubSub. Khi người dùng thực hiện hành động tạo thông báo (Mutation), máy chủ sẽ publish dữ liệu vào một kênh định danh (Channel ID). Toàn bộ các máy khách đã subscribe vào kênh này sẽ nhận được dữ liệu đẩy về ngay lập tức qua kết nối WebSocket liên tục.
4. Dữ liệu âm thanh tải lên được quản lý và bảo vệ như thế nào?
Tệp âm thanh được tải lên thông qua cơ chế Multi-part Form upload, kiểm tra định dạng MIME type (chỉ chấp nhận audio/mpeg, audio/mp3, audio/wav) và giới hạn dung lượng tối đa 25MB. Đường dẫn lưu trữ được băm bảo mật (hash) và quản lý trong cơ sở dữ liệu MongoDB.
5. Khả năng mở rộng (Scalability) của hệ thống khi lượng người dùng tăng đột biến?
Nhờ cấu trúc Docker hóa và thiết kế Stateless của Backend NestJS kết hợp JWT, hệ thống có thể dễ dàng mở rộng theo chiều ngang (Scale-out) bằng cách tăng số lượng container backend phía sau Nginx Reverse Proxy. Cơ sở dữ liệu MongoDB có thể áp dụng mô hình Replica Set hoặc Sharding khi kích thước dữ liệu vượt ngưỡng hàng triệu bản ghi.
Kết luận
Đề tài "Xây dựng hệ thống nghe và chia sẻ nhạc online" đã hiện thực hóa thành công một nền tảng mạng xã hội âm nhạc hiện đại, giải quyết trọn vẹn bài toán kết nối hai chiều giữa người sáng tạo nội dung và người thưởng thức. Bằng việc ứng dụng những công nghệ tiên tiến như Next.js SSR, NestJS, GraphQL Subscriptions, MongoDB và Docker, đồ án không chỉ đạt chuẩn cao về mặt kỹ thuật, khả năng chịu tải và tối ưu hóa SEO mà còn cung cấp một giải pháp thực tiễn có giá trị ứng dụng cao trong lĩnh vực dịch vụ số và truyền thông đa phương tiện.