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.