Rate Limit
Pembatasan jumlah request per endpoint atau per IP
Rate Limiting adalah mekanisme pembatasan jumlah request yang diterima server dari satu IP address dalam periode waktu tertentu. Fitur ini melindungi API dari penyalahgunaan seperti brute force, scraping berlebihan, atau lonjakan request yang tidak terkendali.
Referensi Cepat (Quick Reference)
| Properti | Nilai |
|---|---|
| Aktivasi | RATE_LIMIT_ENABLED=true di file .env |
| Store (single mode) | In-memory |
| Store (cluster mode) | Redis |
| HTTP response saat limit tercapai | 429 Too Many Requests |
| Response headers | X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, Retry-After |
| Endpoint yang dilindungi | Semua endpoint di bawah path /api |
| Graceful degradation | Jika store error, request tetap diteruskan |
Konfigurasi (Configuration)
RATE_LIMIT_ENABLED=true
RATE_LIMIT_WINDOW_MS=60000
RATE_LIMIT_MAX_REQUESTS=100| Parameter | Default | Satuan | Keterangan |
|---|---|---|---|
RATE_LIMIT_ENABLED | false | — | Mengaktifkan fitur rate limiting |
RATE_LIMIT_WINDOW_MS | 60000 | ms | Periode waktu untuk menghitung jumlah request per IP |
RATE_LIMIT_MAX_REQUESTS | 100 | request | Jumlah maksimal request yang diizinkan per IP dalam satu window |
Contoh Konfigurasi (Configuration Examples)
| Skenario | Window | Max Requests |
|---|---|---|
| Development | 60000 (1 menit) | 1000 |
| API Internal (traffic sedang) | 60000 (1 menit) | 200 |
| API Publik (proteksi ketat) | 60000 (1 menit) | 60 |
Store Berdasarkan Mode Server (Store by Server Mode)
| Mode Server | Store | Keterangan |
|---|---|---|
| Single mode | In-memory | Counter disimpan di memory process, Redis tidak diperlukan |
| Cluster mode | Redis | Counter di-share antar worker agar rate limiting akurat secara global |
Pada cluster mode tanpa Redis, setiap worker memiliki counter sendiri sehingga satu IP bisa melewati batas dengan faktor jumlah worker. Redis memastikan counter global yang akurat.
Rate limiting, cache, dan distributed lock adalah tiga fitur yang independen. Ketiganya menggunakan Redis sebagai backend (pada kondisi tertentu), tetapi tidak saling bergantung.
Response Headers
Rate limiter menambahkan header informatif di setiap response:
| Header | Keterangan | Contoh |
|---|---|---|
X-RateLimit-Limit | Jumlah maksimal request per window | 100 |
X-RateLimit-Remaining | Sisa request yang diizinkan dalam window ini | 87 |
X-RateLimit-Reset | Waktu (detik) sampai window di-reset | 45 |
Retry-After | Waktu tunggu sebelum retry, hanya muncul saat 429 | 45 |
Contoh Response Normal (200 OK)
HTTP/1.1 200 OK
X-RateLimit-Limit: 100
X-RateLimit-Remaining: 87
X-RateLimit-Reset: 45Contoh Response Rate Limited (429)
{
"success": false,
"error": "Too Many Requests",
"message": "Rate limit exceeded. Please try again later.",
"retryAfter": 45
}Cara Kerja (How It Works)
Request Masuk
│
├── Rate limit aktif?
│ ├── Tidak → Request langsung diteruskan
│ └── Ya → Identifikasi client IP → Increment counter di store
│ ├── Counter ≤ maxRequests → Set headers → Teruskan request
│ └── Counter > maxRequests → HTTP 429 + Retry-After header
│
└── Store error? → Log warning, request tetap diteruskan (graceful degradation)Rate limiter menggunakan fixed window counter. Setiap IP memiliki counter yang di-reset setelah window berakhir. Pada cluster mode, counter disimpan di Redis menggunakan Lua script atomic (INCR + EXPIRE dalam satu operasi).
Pemecahan Masalah (Troubleshooting)
| Masalah | Penyebab | Solusi |
|---|---|---|
| Rate limit tidak aktif | RATE_LIMIT_ENABLED tidak di-set atau false | Set RATE_LIMIT_ENABLED=true di file .env |
| Server menolak start (cluster mode) | Redis tidak dapat diakses | Periksa REDIS_HOST dan REDIS_PORT |
| Request tetap diterima melebihi limit | Redis down setelah startup (graceful degradation) | Periksa dan pulihkan koneksi Redis |
Header X-RateLimit-* tidak muncul | Rate limit tidak aktif atau module belum di-generate ulang | Verifikasi konfigurasi dan generate ulang module |
Langkah Selanjutnya (Next Steps)
- Cache untuk layer caching berbasis Redis
- Distributed Lock untuk koordinasi write antar worker
- Idempotency untuk proteksi duplikasi request