
Rate limit là gì?
Giới hạn tốc độ, hạn chế số lượng yêu cầu hoặc tác vụ được phép thực hiện trong một khoảng thời gian nhất định
Mục đích:
- Bảo vệ hệ thống
- Giảm nguy cơ hệ thống bị quá tải do quá nhiều yêu cầu cùng lúc.
- Phòng ngừa các cuộc tấn công từ chối dịch vụ (DDoS) hoặc lạm dụng tài nguyên.
- Quản lý tài nguyên
- Phân bổ tài nguyên một cách công bằng giữa các người dùng.
- Đảm bảo chất lượng dịch vụ ổn định cho tất cả người dùng.
- Kiểm soát chi phí
- Hạn chế việc sử dụng quá mức các tài nguyên có chi phí cao (băng thông, CPU, cơ sở dữ liệu,...).
Ví dụ
- API: Một dịch vụ API có thể đặt rate limit là 50 rpm (50 request per minute) cho một tài khoản. Nếu người dùng gửi quá 50 yêu cầu, API sẽ trả về lỗi như:
- HTTP status code: 429 Too Many Requests.
- Website: Một trang web thương mại điện tử có thể giới hạn người dùng tìm kiếm sản phẩm không quá 10 lần mỗi giây để tránh lạm dụng hệ thống.
Các loại rate limit
- Per user: Giới hạn theo từng người dùng hoặc tài khoản.
- Per IP address: Giới hạn dựa trên địa chỉ IP của người gửi yêu cầu.
- Global limit: Áp dụng giới hạn chung cho tất cả người dùng hệ thống.
- Time-based limit: Giới hạn theo khoảng thời gian cụ thể (phút, giờ, ngày,...).
Rate limit trong Nestjs
Nguồn tham khảo: https://docs.nestjs.com/security/rate-limiting
Trong Nestjs, hỗ trợ rate limit qua lib @nestjs/throttler
Lib sử dụng lại rate lite IP address và Time-based limit (đơn vị ms).
Các cách khai báo Rate limit trong nestjs
1. Global
"File: app.module.js"
@Module({
imports: [
ThrottlerModule.forRoot([{
ttl: 60000,
limit: 10,
}]),
],
})
export class AppModule {}