Redis ile Rate Limiting Uygulamaları


Redis ile Rate Limiting Uygulamaları

Redis ile rate limiting uygulamaları, modern web servislerinde API isteklerinin kontrol altına alınmasını sağlayan, ölçeklenebilir ve performanslı bir çözümdür. Rate limiting; olası kötüye kullanımları, bot saldırılarını ve aşırı talepten kaynaklanan performans problemlerini önlemek için yaygın olarak tercih edilir. Redis’in yüksek hızlı key-value store mimarisi ve atomik işlemleri, bu alanda temel bir avantaj sunar.

Rate Limiting Nedir ve Neden Gereklidir?

Rate limiting, bir kullanıcının veya istemcinin belirli bir zaman aralığında yapabileceği istek sayısını kısıtlama işlemidir. Örneğin, bir API üzerinde bir kullanıcıya dakika başına 100 istek limiti tanımlayabilirsiniz. Böylece hem kaynak tüketimini dengelersiniz hem de hizmet sürekliliğini güvence altına alırsınız. Redis ile rate limiting uygulamaları esnek ve merkezi çözümler sunar; farklı sunuculara dağılan istemcileri kolayca izler ve kısıtlar.

Redis ile Rate Limiting Uygulama Yöntemleri

1. Sabit Pencere (Fixed Window)

Sabit pencere algoritmasında, her bir kullanıcı için Redis'te zaman damgalı sayaçlar tutulur. Belirlenen aralıkta sayaç limiti aşıldığında yeni istekler reddedilir. Aşağıdaki örnek Node.js ve ioredis kütüphanesiyle bir sabit pencere rate limiting mantığı sunar:

const Redis = require('ioredis');
const redis = new Redis();

async function isAllowed(userId, limit = 100, windowSec = 60) {
  const key = `rate_limit:${userId}:${Math.floor(Date.now() / (windowSec * 1000))}`;
  const count = await redis.incr(key);
  if (count === 1) {
    await redis.expire(key, windowSec);
  }
  return count <= limit;
}

// Kullanıcı karmaşık davranışları önlemek için kullanımı:
// if (await isAllowed('user123')) { /* devam et */ }

2. Slaytlı Pencere (Sliding Window)

Slaytlı pencere yaklaşımı, daha hassas ve adil bir rate limiting sunar. Redis'te sorted set (ZSET) veri yapısını kullanarak kullanıcı istek zaman damgaları tutulur. Son N saniyede yapılan istekler izlenir. Aşağıdaki örnek, bu yöntemi Node.js üzerinde gösterir:

async function isAllowedSliding(userId, limit = 10, windowSec = 60) {
  const key = `rate_limit_slide:${userId}`;
  const now = Date.now();
  await redis.zremrangebyscore(key, 0, now - windowSec * 1000);
  const reqCount = await redis.zcard(key);
  if (reqCount >= limit) return false;
  await redis.zadd(key, now, `${now}`);
  await redis.expire(key, windowSec);
  return true;
}

Sonuç: Redis ile Güçlü Rate Limiting

Redis ile rate limiting uygulamaları, ölçeklenebilirlik ve yüksek performans açısından büyük avantajlar sunar. Gerçek zamanlı sayaç işlemleri, atomik güncelleme yetenekleri ve farklı rate limiting algoritmalarının kolayca uygulanabilmesi, Redis’i bu amaç için ideal hale getirir. Siz de Redis ile rate limiting kullanarak API servislerinizi güvenli, adil ve verimli yönetebilirsiniz.