Rate Limiting pattern

Rate Limiting pattern
Rate Limiting Pattern là một kỹ thuật hạn chế số lượng request mà một client có thể gửi đến một hệ thống trong một khoảng thời gian nhất định.
Mục đích chính:
Ngăn chặn quá tải hệ thống.
Bảo vệ API khỏi tấn công DDoS hoặc lạm dụng tài nguyên.
Cung cấp dịch vụ ổn định và công bằng giữa các user.
Ví dụ: Một API chỉ cho phép 100 request/phút từ mỗi user. Nếu vượt quá, API sẽ trả về lỗi HTTP 429 (Too Many Requests
Cơ chế hoạt động
Theo dõi số lượng request từ mỗi client (hoặc IP, user ID, API key, ...) và quyết định có chấp nhận hay từ chối request tiếp theo dựa trên quota đã thiết lập.
Các thuật toán phổ biến để thực hiện Rate Limiting
1. Fixed Window Counter (Giới hạn theo cửa sổ cố định)
Mỗi khoảng thời gian cố định (vd: 1 phút), hệ thống kiểm tra số lượng request.
Nếu quá số lượng cho phép, request sẽ bị từ chối.
Ví dụ: API chỉ cho phép 100 request/phút từ một client.
Nhược điểm: Có thể xảy ra tình huống burst traffic (nhiều request trong thời gian ngắn trước khi reset).
2. Sliding Window Counter (Giới hạn theo cửa sổ trượt)
Tương tự Fixed Window nhưng thay vì reset tại một điểm cố định, nó sử dụng khoảng thời gian trượt để tính toán request trong khoảng thời gian gần nhất.
Giảm tình trạng burst traffic.
3. Token Bucket (Xô chứa token)
Mỗi client có một "xô" chứa token.
Mỗi request cần 1 token để thực hiện.
Token được cấp lại định kỳ với tốc độ cố định.
Nếu xô hết token, request sẽ bị từ chối hoặc phải đợi.
Ưu điểm: Kiểm soát được tốc độ request nhưng vẫn cho phép burst traffic nhỏ nếu có sẵn token.
4. Leaky Bucket (Xô rò rỉ)
Hoạt động như Token Bucket nhưng thay vì cấp token theo đợt, nó cho phép xử lý request với tốc độ ổn định (vd: 10 request/giây).
Nếu request đến nhanh hơn tốc độ xử lý, request sẽ bị drop.
Ưu điểm: Hạn chế burst traffic tốt hơn Token Bucket.
Trường hợp sử dụng
Rate Limiting thường được áp dụng trong các trường hợp:
Bảo vệ API khỏi DDoS: Nếu một IP gửi quá nhiều request trong thời gian ngắn, hệ thống sẽ block.
Quản lý quota người dùng: Ví dụ, gói miễn phí của một API chỉ cho phép 1000 request/ngày.
Cân bằng tải trong hệ thống: Hạn chế số lượng request từ một microservice đến một backend cụ thể.
Giới hạn tốc độ truy vấn Database: Để tránh query quá tải DB.
Kiểm soát request trong hệ thống thanh toán: Ngăn chặn spam giao dịch.
Cách triển khai
1. Sử dụng API Gateway (Kong, Nginx, AWS API Gateway, Traefik)
API Gateway là nơi lý tưởng để triển khai Rate Limiting vì nó nằm ở lớp đầu vào của hệ thống, dễ kiểm soát request.
Ví dụ Rate Limiting với Kong API Gateway
plugins:
- name: rate-limiting
config:
second: 5 # Tối đa 5 request/giây
minute: 100 # Tối đa 100 request/phút
policy: local # Áp dụng giới hạn trên một node
Nếu một user gửi hơn 5 request/giây, hệ thống sẽ trả về HTTP 429 Too Many Requests.
Ví dụ Rate Limiting trong AWS API Gateway
{
"throttle": {
"rateLimit": 100,
"burstLimit": 200
}
}
Giới hạn 100 request/giây với burst tối đa 200 request.
2. Triển khai trong Spring Boot
Ví dụ cấu hình Rate Limiting trong Spring Boot
@Bean
public RateLimiter rateLimiter() {
return RateLimiter.of("apiRateLimiter",
RateLimiterConfig.custom()
.limitRefreshPeriod(Duration.ofSeconds(1))
.limitForPeriod(10) // Giới hạn 10 request/giây
.timeoutDuration(Duration.ofMillis(500))
.build());
}
@GetMapping("/api/data")
public ResponseEntity<String> getData() {
if (!rateLimiter.tryAcquire()) {
return ResponseEntity.status(HttpStatus.TOO_MANY_REQUESTS).body("Too many requests");
}
return ResponseEntity.ok("Success");
}
Nếu vượt quá 10 request/giây, API sẽ trả về HTTP 429.
3. Sử dụng Redis để lưu trạng thái Rate Limiting
Redis thường được dùng để lưu trạng thái số lượng request vì nó nhanh và hỗ trợ TTL (Time-to-Live).
Subscribe to my newsletter
Read articles from Dương Tiến directly inside your inbox. Subscribe to the newsletter, and don't miss out.
Written by
