Rate Limiting
Membatasi jumlah request yang boleh dilakukan client dalam periode waktu tertentu.
Rate Limiting adalah teknik membatasi jumlah request yang client (user/IP) boleh kirim ke server dalam periode waktu tertentu. Tujuannya: mencegah abuse (brute force, scraping), melindungi server dari overload, dan fair usage (satu user tidak memakan semua resources). Strategi rate limiting: Fixed Window (counter reset per interval), Sliding Window (lebih akurat, melacak timestamp setiap request), Token Bucket (user punya ‘token’ yang di-refill per interval — Google Cloud API pakai ini), dan Leaky Bucket (request masuk queue dan diproses dengan rate konstan). Implementasi bisa menggunakan Redis (store counter), in-memory (tapi tidak scalable multi-server), atau library seperti express-rate-limit.
Contoh Kode
// Rate limiting dengan Redis
async function rateLimit(key: string, max: number, windowSeconds: number) {
const current = await redis.incr(key);
if (current === 1) {
await redis.expire(key, windowSeconds);
}
if (current > max) {
const ttl = await redis.ttl(key);
throw new Error(`Rate limit exceeded. Retry in ${ttl}s`);
}
return { remaining: max - current, resetIn: windowSeconds };
}
// Penggunaan: rateLimit(`rate:${ip}`, 100, 60) // 100 requests per 60s