Lewati ke konten utama
menjadi.dev
Backend

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