0

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

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí