Xây dựng API Nest.js có thể xử lý hàng triệu yêu cầu mà không bị sập
## ⚡ 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ẽ! 🚀
All rights reserved