429 Hatası Ne Anlama Gelir?

HTTP 429 Too Many Requests, bir API'ye belirli bir zaman diliminde izin verilenden daha fazla istek gönderildiğinde dönen standart bir durum kodudur. Gemini API bağlamında bu, hesabınıza tanımlı RPM (dakikalık istek) veya RPD (günlük istek) kotasının aşıldığı anlamına gelir. Sunucu isteğinizi işlemeyi reddeder ve genelde bir süre bekleyip tekrar denemenizi bekler.

Bu hata tek başına bir "arıza" değil — sistemin sizi korumak (ve kaynaklarını adil paylaştırmak) için tasarlanmış bir mekanizmasıdır. Ama uygulamanızda bu hatayı doğrudan kullanıcıya yansıtırsanız, kullanıcı deneyimi ciddi şekilde bozulur.

Neden Oluşur?

En sık karşılaşılan nedenler şunlardır:

Çözüm 1: Retry + Exponential Backoff

İlk savunma hattı, isteği hemen tekrar denemek yerine, denemeler arasındaki bekleme süresini her seferinde katlayarak artırmaktır (1sn → 2sn → 4sn → 8sn gibi). Kısa süreli kota patlamalarının büyük kısmı bu şekilde sessizce çözülür, çünkü kota genelde birkaç saniye içinde kendini toparlar.

async function callWithRetry(fn, retries = 3, baseDelayMs = 1000) {
  for (let attempt = 0; attempt <= retries; attempt++) {
    try {
      return await fn();
    } catch (error) {
      const isRateLimit = error?.status === 429;
      const isLastAttempt = attempt === retries;
      if (!isRateLimit || isLastAttempt) throw error;

      const delay = baseDelayMs * Math.pow(2, attempt);
      await new Promise(r => setTimeout(r, delay));
    }
  }
}

Burada dikkat edilmesi gereken önemli bir nokta: retry sayısını ve toplam bekleme süresini sınırsız bırakmayın. Özellikle serverless ortamlarda (Vercel, AWS Lambda vb.) fonksiyonunuzun kendi süre limiti var — retry mantığı bu limiti aşarsa, kota sorunu çözülmeden önce fonksiyon zaten zaman aşımına uğrar.

Çözüm 2: Otomatik Fallback (İkinci Sağlayıcı)

Retry, kota gerçekten tükendiğinde işe yaramaz — çünkü sorun geçici değil, kalıcıdır. Bu noktada devreye girmesi gereken şey, birincil sağlayıcı (örneğin Gemini) başarısız olduğunda otomatik olarak ikinci bir sağlayıcıya (örneğin OpenRouter üzerinden farklı bir modele) geçen bir fallback katmanıdır.

try {
  result = await callGemini(prompt);
} catch (error) {
  if (isRateLimitError(error)) {
    result = await callOpenRouterFallback(prompt); // farklı sağlayıcı
  } else {
    throw error;
  }
}

Bu yaklaşımın en büyük avantajı, kullanıcının hiçbir zaman hata görmemesi — sistem kendi kendini iyileştiriyor. Tek bir sağlayıcıya bağımlı kalmamak, üretim ortamındaki en kritik dayanıklılık (resilience) prensiplerinden biridir.

Çözüm 3: Billing ve Kota Artırımı

Retry ve fallback, semptomu yönetir; asıl kök nedeni çözmek için Google Cloud Console veya Google AI Studio üzerinden projenizin billing (faturalandırma) durumunu kontrol edin. Faturalandırma aktifse kota tavanı ciddi şekilde yükselir — çoğu zaman ücretsiz kullanım kotası içinde bile kalırsınız, sadece tavan artar.

Beklenmedik ücretlendirme riskine karşı mutlaka bütçe uyarısı (budget alert) ve kota limiti tanımlayın — bu, hem maliyet kontrolü hem de olası bir API anahtarı sızıntısına karşı bir güvenlik önlemidir.

Serverless Ortamında Dikkat Edilmesi Gerekenler

Vercel gibi serverless platformlarda her fonksiyonun kendi maksimum çalışma süresi (maxDuration) vardır. Retry bütçenizi (toplam bekleme süresini) bu limitin altında tutmazsanız, fonksiyon kota sorunu çözülmeden zaten zaman aşımına uğrar — fallback'e hiç sıra gelmez. Kural olarak: her fonksiyonun retry bütçesi, kendi süre limitinin yaklaşık yarısını geçmemeli; kalan süre fallback çağrısına ve yanıt işlemeye ayrılmalı.

Gerçek Vaka: Prodüksiyonda Yaşadığım Sorun

Aşağıda, bu portföy sitesindeki yapay zeka destekli araçlarda (web sitesi analiz aracı, fotoğraf değerlendirme aracı, kalori hesaplayıcı) yukarıdaki stratejileri gerçekten nasıl uyguladığımı özetliyorum.

RESOLVED
API Kota Tükenmesi
SORUN Gemini API'si prodüksiyonda 429 hataları vermeye başladı; birden fazla endpoint aynı API anahtarını paylaşıyordu ve kullanıcıya doğrudan 500 hatası dönüyordu.
ÇÖZÜM Exponential backoff ile retry mantığı ekledim; her endpoint'in kendi maxDuration limitine göre retry bütçesini ayarladım; kota tükendiğinde otomatik olarak OpenRouter'a geçen bir fallback katmanı kurdum.
SONUÇ Kullanıcı hiçbir hata görmüyor, sistem kendini otomatik iyileştiriyor; %0 kalıcı kesinti.
#serverless #resilience #fallback

Sıkça Sorulan Sorular

429 hatası ne anlama gelir?
Bir API'ye izin verilen istek sayısının belirli bir zaman diliminde aşıldığını gösteren HTTP durum kodudur. Sunucu isteğinizi işlemeyi reddeder ve genelde bir süre bekleyip tekrar denemenizi ister.
Gemini API'de 429 hatası neden oluşur?
En sık nedenler: ücretsiz kullanım kotasının aşılması, birden fazla endpoint'in aynı API anahtarını paylaşması, billing'in aktif edilmemiş olması ve ani trafik artışlarıdır.
Retry ve exponential backoff nedir?
Bir istek başarısız olduğunda hemen tekrar denemek yerine, denemeler arasındaki bekleme süresini katlayarak artırma stratejisidir. Kısa süreli kota patlamalarının çoğunu sessizce çözer.
Retry yetmezse ne yapmalı?
Kota gerçekten tükendiğinde retry de başarısız olur. Bu durumda otomatik olarak ikinci bir sağlayıcıya geçen bir fallback mekanizması kurmak, hizmeti kesintisiz sürdürmenizi sağlar.