blog.dopana

Back

Rate limiting bảo vệ API khỏi abuse, brute force, và traffic spike. Bài này trình bày các thuật toán phổ biến và cách implement.

Tại Sao Cần Rate Limiting?#

  • Chống DDoS, brute force
  • Đảm bảo fair usage cho tất cả user
  • Bảo vệ backend khỏi quá tải
  • Giảm chi phí (đặc biệt với AI API)

Thuật Toán#

1. Fixed Window Counter#

Đơn giản nhất — đếm request trong cửa sổ thời gian cố định:

Vấn đề: Traffic burst ở biên giới window — 10 request ở 0:59 và 10 request ở 1:00 = 20 request trong 2 giây.

2. Sliding Window Log#

Lưu timestamp từng request — kiểm tra số request trong N giây qua:

Chính xác hơn nhưng tốn bộ nhớ — lưu timestamp mỗi request.

3. Sliding Window Counter (Redis)#

Kết hợp fixed window + sliding — dùng Redis sorted set:

4. Token Bucket#

Bucket chứa N token. Mỗi request lấy 1 token. Token được thêm vào với rate R.

Ưu điểm: Cho phép burst ngắn (nếu bucket đầy) nhưng rate trung bình ổn định.

5. Leaky Bucket#

Request vào bucket, xử lý với rate cố định. Nếu bucket đầy → request bị từ chối.

Dùng hàng đợi — phù hợp cho xử lý bất đồng bộ.

Implementation — Express Middleware#

Response Headers#

Luôn trả về rate limit info trong response headers:

X-RateLimit-Limit: 100
X-RateLimit-Remaining: 45
X-RateLimit-Reset: 1718845200
Retry-After: 45
http

Cloudflare Rate Limiting#

Cloudflare có rate limiting built-in:

# Wrangler AI — hoặc dashboard
wrangler ratelimit create my-limit --limit 100 --period 60
bash

Workers:

export default {
  async fetch(request: Request, env: Env): Promise<Response> {
    const key = request.headers.get('CF-Connecting-IP') || 'unknown';
    const { success } = await env.myRateLimiter.limit({ key });

    if (!success) {
      return new Response('Too Many Requests', { status: 429 });
    }

    return new Response('OK');
  },
};
typescript

Distributed Rate Limiting#

Khi nhiều server — dùng Redis centralized:

Server 1 ─┐
Server 2 ─┼→ Redis (atomic counters)
Server 3 ─┘
text

Redis Lua script — atomic:

Best Practices#

  1. Always return headers — client biết khi nào retry
  2. Different limits per endpoint — auth strict, public loose
  3. Use token key — IP + API key + userId
  4. Distributed store — Redis nếu nhiều server
  5. Graceful degradation — khi Redis down → allow temporarily
  6. Log violations — để phát hiện abuse pattern

Kết Luận#

Rate limiting không chỉ là bảo vệ — nó là quản lý tài nguyên. Fixed window đơn giản, sliding window chính xác, token bucket linh hoạt. Redis cho distributed systems. Cloudflare cho edge rate limiting. Chọn theo nhu cầu: đơn giản hay chính xác.

Tài liệu tham khảo#