Ana içeriğe geç

Valkey ile API Hız Sınırlayıcı (Rate Limiter) Geliştirme

Bu rehberde ne öğreneceksiniz?​

Bu rehber, API’lerinizi aşırı kullanım ve DDoS risklerine karşı koruyan bir rate limiter yapısını öğretir.
Valkey’in bellek içi yapısı ve atomik işlemleriyle güvenli, hızlı ve ölçeklenebilir bir çözüm kurarsınız.


🧠 Teknik Özet​

Konu: Valkey (Redis uyumlu, in-memory veritabanı) ile API hız sınırlama.
Problem: Aşırı istekler, DDoS ve kaynak tükenmesi.
Adımlar: Valkey kurulumu → Express.js middleware → Lua ile atomik sayaç → Next.js entegrasyonu.


Hız Sınırlayıcı Nedir?​

Hız sınırlayıcı, bir istemcinin belirli sürede yapabileceği istek sayısını kısıtlar.
Amaç, sistemi stabil ve adil tutmaktır.

Neden Gereklidir?​

  • Kötüye kullanımı önler
  • DDoS etkisini azaltır
  • Maliyetleri düşürür
  • API performansını korur

Valkey, bu senaryo için düşük gecikme ve atomik işlem avantajı sağlar.


Mimari ve Akış​

Bileşenler:

  1. Frontend (Next.js): Kullanıcı etkileşimi
  2. Backend (Express.js): Trafik kontrolü
  3. Valkey: Sayaç ve TTL yönetimi

Akış: İstek → Backend → Valkey sayaç kontrolü → İzin/429 yanıtı.


Valkey Veritabanı Kurulumu​

  1. Bulut panelinden Valkey motorunu seçin.
  2. Bölge ve plan belirleyin.
  3. Host, Port, Parola bilgilerini not edin.

Bu adım, yönetilen ve güvenli bir Valkey kümesi oluşturur.


Backend: Express.js ile Rate Limiter​

Ortam Değişkenleri​

VALKEY_HOST=db-adresi
VALKEY_PORT=25061
VALKEY_PASSWORD=parola
  • Bu değişkenler güvenli bağlantı için kullanılır.

Valkey Bağlantısı​


const Redis = require('ioredis');

const redis = new Redis({
host: process.env.VALKEY_HOST,
port: Number(process.env.VALKEY_PORT),
password: process.env.VALKEY_PASSWORD,
tls: {}
});
  • Bu yapı, TLS ile Valkey’e bağlanır.

Atomik Sayaç (Lua)​


const rateLimiterLuaScript = `
local current
current = redis.call("INCR", KEYS[1])
if tonumber(current) == 1 then
redis.call("EXPIRE", KEYS[1], ARGV[1])
end
return current
`;
  • Bu script, sayaç artırma ve TTL ayarını tek adımda yapar.

Middleware​


const rateLimiter = async (req, res, next) => {
const ip = req.ip || 'global';
const limit = 5;
const windowInSeconds = 60;
const key = `rate:${ip}`;

const current = await redis.eval(rateLimiterLuaScript, 1, key, windowInSeconds);
if (current > limit) return res.status(429).send('Hız sınırı aşıldı');
next();
};
  • Bu middleware, dakikada 5 isteği sınırlar.

Korumalı Endpoint​


app.get('/api/saka', rateLimiter, (req, res) => {
res.send("Chuck Norris kod yazmaz, kod kendini yazar.");
});

- Bu endpoint, rate limiter ile korunur.

Frontend Entegrasyonu (Next.js)​


const response = await fetch('/api/saka');
if (response.status === 429) setError("Çok fazla istek");
  • Frontend, 429 yanıtlarını kullanıcıya bildirir.

Neden Valkey?​

1. Multi-threading: Yük altında daha iyi ölçeklenir

2. Bellek verimliliği: Düşük overhead

3. Uyumluluk: Redis kütüphaneleriyle sorunsuz

4. Gözlemlenebilirlik: Sayaç ve gecikme takibi


Sıkça Sorulan Sorular​

1. IP yerine kullanıcı bazlı limit olur mu? Evet. Anahtarı rate:userId şeklinde oluşturun.

2. Lua neden gerekli? Atomiklik sağlar, yarış koşullarını önler.

3. Prod ortamına uygun mu? Evet. Yüksek trafikte güvenilirdir.

4. TTL neden önemli? Sayaçların otomatik sıfırlanmasını sağlar.

Sonuç​

Bu rehberle Valkey kullanarak güvenli ve ölçeklenebilir bir API hız sınırlayıcı kurdunuz. API kararlılığını artırmak için bu mimariyi üretimde kullanabilirsiniz.

Yönetilen ve yüksek performanslı altyapılar için Rabisu Bulut platformunda hemen deneyebilirsiniz.