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:
- Frontend (Next.js): Kullanıcı etkileşimi
- Backend (Express.js): Trafik kontrolü
- Valkey: Sayaç ve TTL yönetimi
Akış: İstek → Backend → Valkey sayaç kontrolü → İzin/429 yanıtı.
Valkey Veritabanı Kurulumu
- Bulut panelinden Valkey motorunu seçin.
- Bölge ve plan belirleyin.
- 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.