- vừa được xem lúc

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

0 0 2

Người đăng: hiệp nguyễn

Theo Viblo Asia


## ⚡ 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ẽ! 🚀

Bình luận

Bài viết tương tự

- vừa được xem lúc

"Got me chìm sâu" cùng Functional Programming

Mở đầu. Functional Programming (FP) đã thu hút được sự chú ý đáng kể trong thế giới phát triển phần mềm và các nhà phát triển JavaScript đang ngày càng chuyển sang mô hình này để giải quyết vấn đề hiệ

0 0 12

- vừa được xem lúc

Hoc copilot

Học Copilot AI. Trong thế giới phát triển phần mềm ngày nay, việc xây dựng và tối ưu hóa các API (Application Programming Interface) đóng một vai trò quan trọng trong việc giúp hệ thống hoạt động hiệu

0 0 7

- vừa được xem lúc

Xử lý API response với Typescript với mọi ngôn ngữ frontend

Với 1 frontend developer, việc xử lý API là 1 tác vụ quan trọng trong xử lý thông tin giữa logic component và backend.2 nhiệm vụ chính của việc xử lý API đó là handle error,success và middleware (opti

0 0 13

- vừa được xem lúc

Hướng dẫn finetune mô hình LLM đơn giản và miễn phí với Unsloth

Chào mừng các bạn đến với bài viết hướng dẫn chi tiết cách finetune (tinh chỉnh) một mô hình ngôn ngữ lớn (LLM) một cách đơn giản và hoàn toàn miễn phí sử dụng thư viện Unsloth. Trong bài viết này, ch

0 0 8

- vừa được xem lúc

SERIES INDEX NÂNG CAO - BÀI 1: PHÂN TÍCH NHỮNG SAI LẦM PHỔ BIẾN KHI SỬ DỤNG INDEX TRONG MYSQL

Nếu anh em thấy hay thì ủng hộ tôi 1 follow + 1 upvote + 1 bookmark + 1 comment cho bài viết này tại Mayfest 2025 nhé. Còn nếu bài viết chưa hữu ích thì tôi cũng hi vọng anh em để lại những góp ý thẳn

0 0 8

- vừa được xem lúc

"Hack" Não Số Lớn Với Digit DP!

Xin chào anh em, những chiến binh thuật toán kiên cường. Phản ứng đầu tiên của nhiều anh em (có cả tôi): "Ối dào, dễ! Quất cái for từ 1 đến 101810^{18}1018 rồi check thôi!".

0 0 10