## ⚡ Muốn xây dựng một API Nest.js có thể mở rộng tới hàng triệu yêu cầu mà không bị lỗi? Đây là cách làm đúng! 🚀 > ⚡ Muốn xây dựng **API Nest.js** có thể xử lý **hàng triệu yêu cầu** mà không bị lỗi? Đây là cách đúng đắn! 🚀 --- ### 🔥 Thách thức: Lưu lượng truy cập cao có thể làm sập API của bạn Nest.js là một **framework mạnh mẽ**, nhưng nếu bạn không tối ưu hóa đúng cách, một đợt tăng lưu lượng bất ngờ có thể **khiến API sập**. 📉 **Các nguyên nhân phổ biến gây chậm hiệu năng:** ❌ Các thao tác chặn trong luồng chính ❌ Tối ưu hóa truy vấn cơ sở dữ liệu kém ❌ Rò rỉ bộ nhớ làm chậm API ❌ Vấn đề giới hạn tốc độ khiến bot làm quá tải máy chủ 👉 Hãy **mở rộng API Nest.js** của bạn như một chuyên gia! --- ### 🚀 1. Dùng mã bất đồng bộ & không chặn **Quy tắc số 1** để xử lý lưu lượng cao? **Không bao giờ chặn luồng chính.** 📌 **Dùng async/await với Promise:** ```ts
import { Injectable } from '@nestjs/common'; @Injectable()
export class AppService { async getData(): Promise<string> { return new Promise((resolve) => { setTimeout(() => resolve('Hello, world!'), 1000); }); }
}
📌 Tránh các tác vụ đồng bộ tốn CPU:
Ví dụ xấu ❌:
for (let i = 0; i < 1e9; i++) {} // Chặn luồng xử lý!
✅ Thay vào đó, chuyển tác vụ nặng cho Worker Threads (sẽ nói sau).
🔧 2. Tối ưu hóa truy vấn cơ sở dữ liệu
✅ Dùng chỉ mục để tăng tốc truy vấn
CREATE INDEX idx_user_email ON users (email);
✅ Tránh dùng SELECT * (chỉ lấy những gì cần)
Ví dụ xấu ❌:
const users = await prisma.user.findMany(); // Lấy toàn bộ dữ liệu, rất chậm!
Ví dụ tốt ✅:
const users = await prisma.user.findMany({ select: { id: true, name: true, email: true },
});
✅ Bật cache truy vấn bằng Redis:
import { Redis } from 'ioredis'; const redis = new Redis(); async function getCachedUser(id: string) { const cachedUser = await redis.get(`user:${id}`); if (cachedUser) return JSON.parse(cachedUser); const user = await prisma.user.findUnique({ where: { id } }); await redis.set(`user:${id}`, JSON.stringify(user), 'EX', 3600); // Cache 1 giờ return user;
}
🛠 3. Giới hạn tốc độ để ngăn lạm dụng
📌 Cài middleware giới hạn tốc độ:
npm install express-rate-limit
📌 Áp dụng trong ứng dụng Nest.js:
import * as rateLimit from 'express-rate-limit';
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module'; async function bootstrap() { const app = await NestFactory.create(AppModule); app.use( rateLimit({ windowMs: 60 * 1000, // 1 phút max: 100, // Giới hạn 100 yêu cầu mỗi IP mỗi phút }), ); await app.listen(3000);
}
bootstrap();
✅ Bảo vệ API khỏi các cuộc tấn công DDoS 🚀
📈 4. Dùng cân bằng tải với nhiều instance
✅ Chạy nhiều instance bằng PM2:
npm install pm2 -g
pm2 start dist/main.js -i max
✅ Dùng Nginx để cân bằng tải
📌 Chỉnh file cấu hình Nginx (/etc/nginx/nginx.conf
):
upstream nest_api { server 127.0.0.1:3000; server 127.0.0.1:3001;
} server { listen 80; location / { proxy_pass http://nest_api; }
}
✅ Các yêu cầu giờ đây được phân phối đều! 🎯
🔄 5. Chuyển tác vụ nặng sang tiến trình nền
📌 Cài đặt BullMQ:
npm install bullmq ioredis
📌 Tạo hàng đợi (task.queue.ts
):
import { Queue, Worker } from 'bullmq';
import { redisConfig } from './redis.config'; const taskQueue = new Queue('tasks', { connection: redisConfig }); new Worker('tasks', async (job) => { console.log(`Đang xử lý task: ${job.id}`); await new Promise((res) => setTimeout(res, 5000)); // Giả lập độ trễ console.log(`Hoàn thành task: ${job.id}`);
}); export { taskQueue };
📌 Thêm tác vụ vào hàng đợi (task.service.ts
):
import { Injectable } from '@nestjs/common';
import { taskQueue } from './task.queue'; @Injectable()
export class TaskService { async addTask(data: any) { await taskQueue.add('longTask', data); return { message: 'Task đã được thêm vào hàng đợi!' }; }
}
✅ API vẫn hoạt động và xử lý các yêu cầu khác!
🚀 Kết luận: Mở rộng như một chuyên gia
Xử lý hàng triệu yêu cầu với Nest.js hoàn toàn khả thi nếu bạn: ✅ Dùng mã bất đồng bộ & không chặn ✅ Tối ưu hóa truy vấn & cache cơ sở dữ liệu ✅ Thêm giới hạn tốc độ để ngăn lạm dụng ✅ Triển khai nhiều instance với cân bằng tải ✅ Chuyển tác vụ nặng sang nền
🔥 Giờ API Nest.js của bạn đã sẵn sàng để mở rộng mạnh mẽ! 🚀