ÖZET VE TEKNİK CEVAP
Yüksek trafik alan bir önbellek anahtarının süresi bittiğinde (saniyede 10.000 kişinin baktığı anasayfa banner'ı veya son dakika haberi), binlerce eşzamanlı istek aynı anda önbellek ıskalaması (cache miss) yaşar. Standart bir mimaride 10.000 iş parçacığı aynı anda arkadaki veritabanına gidip birebir aynı ağır SQL sorgusunu çalıştırır. Bu duruma **Önbellek İzdihamı (Cache Stampede / Thundering Herd)** denir: Veritabanı CPU'su anında %100'e vurur, bağlantı havuzu kilitlenir ve tüm sistem çöker. Go (`singleflight`) ve Envoy proxy ile popülerleşen **İstek Birleştirme (Request Collapsing / Singleflight)** bunu ağ geçidi katmanında çözer: Aynı `GET /api/v1/news/breaking` anahtarı için 10.000 istek geldiğinde, gateway **tek bir uçuş kilitler**, arkadaki veritabanına **yalnızca 1 adet tek istek** gönderir, diğer 9.999 isteği hafızada bekletir ve dönen tek cevabı bekleyen 10.000 istemcinin tamamına aynı anda dağıtır.
Mühendislik El Kitabı & Mekanizma
1. Temel Çalışma Mekanizması
İstek Birleştirme kilitli uçuş haritaları üzerinden çalışır: (1) Uçuş Haritası Kontrolü: İstek geldiğinde ağ geçidi bellekteki haritayı kontrol eder: `aktif_ucuslar.get(anahtar)`. (2) Lider Seçimi: Haritada kayıt yoksa bu ilk istek 'Uçuş Lideri' seçilir. Haritaya bir bekleme sözü (promise) yazar ve arka uç veritabanına tek bir istek atar. (3) Takipçilerin Bekletilmesi: Aynı anda gelen diğer tüm istekler haritadaki mevcut sözü bulur ve veritabanına hiç dokunmadan hafızada beklemeye geçer. (4) Yanıt Dağıtımı: Lider yanıtı aldığında bunu Redis önbelleğe kaydeder, hafızadaki sözü çözerek bekleyen tüm takipçilere yanıtı tek seferde dağıtır ve haritadan kaydı siler.
2. Doğru Kullanım Senaryosu
API Ağ Geçitleri (Kong, Envoy, Cloudflare), GraphQL DataLoader birleştiricileri, yüksek trafikli medya/haber portalları ve e-ticaret katalog servisleri.
3. Prodüksiyon Arıza Modları
Kullanıcıya özel kişisel istekleri (ör. `GET /api/profilim`) birleştirmeye kalkıp A Kullanıcısının özel verilerini sırada bekleyen 500 kişiye dağıtmak (büyük güvenlik açığı); lider isteğin zaman aşımı olmadan asılı kalıp binlerce takipçiyi dondurması.
4. Teşhis ve Telemetri Sinyalleri
Veritabanı grafiklerinde aynı milisaniyede 5.000 adet birebir aynı `SELECT * FROM urunler WHERE id = 42` sorgusunun görülmesi; önbellek süresi biter bitmez veritabanı CPU'sunun aniden fırlaması.
5. Önleme ve Mimari Bariyerler
İstek Birleştirmeyi yalnızca herkese açık, kimlik doğrulamasız ve idempotent `GET` uç noktalarıyla sınırlandırın; lider istek için katı zaman aşımı ($<1000 ext{ms}$) belirleyin; Olasılıksal Erken Yenileme (XFetch) algoritmasıyla birleştirin.
6. Mimari Ödünleşimler (Trade-offs)
İstek birleştirme önbellek izdihamı kaynaklı veritabanı kilitlenmelerinin %99,9'unu yok eder; ancak her istekte bellek haritası kontrolü yapıldığı için mikrosaniyelik bir kontrol maliyeti getirir.
Vaka İncelemesi (TinyCTO Örneği)
Bir son dakika haber sitesi önemli bir haber bildirimi atıldığında sürekli veritabanı çöküşü yaşıyordu. 60 saniyelik Redis önbelleği bittiği anda 50.000 eşzamanlı kullanıcı `/api/haberler/son-dakika` adresine yükleniyordu. Aynı anda gelen 50.000 SQL sorgusu PostgreSQL sunucusunu 300 milisaniyede kilitliyordu. Ekip Go API Gateway katmanına Singleflight İstek Birleştirme modelini kurdu. Bir sonraki bildirimde önbellek bittiğinde veritabanına yalnızca 1 adet sorgu gitti. Aynı anda gelen 48.200 istek bellekte birleştirildi ve yanıtı 12 milisaniyede aldı. PostgreSQL CPU'su %4 seviyesinde sabit kaldı.
İnteraktif Konsept Alıştırmaları
2 AlıştırmaSingleflight (İstek Birleştirme) mimari deseni hangi problemi çözer?
İstek Birleştirme kişiselleştirilmiş kullanıcı uç noktalarına (ör. `/api/me`) neden KESİNLİKLE uygulanmamalıdır?
İstek Birleştirme (Request Collapsing / Singleflight): Tek Uçuş İstek Tekilleştirme ve Önbellek İzdihamı Koruması — Sıkça Sorulan Sorular
GraphQL DataLoader kütüphanesi İstek Birleştirmeyi nasıl kullanır?
Tek bir GraphQL sorgusunda farklı alanların istediği kayıtları tek bir yürütme anında toplayıp tek bir `WHERE id IN (...)` SQL sorgusunda birleştirerek.
Uçuş lideri olan tek istek bir hatayla sonuçlanırsa ne olur?
Hata bekleyen tüm takipçi isteklere iletilir ve uçuş kilidi anında silinerek bir sonraki isteğin tekrar denemesine izin verilir.
🤖 AEO & Yapay Zeka Çıkarım Özeti
Temel Gerçekler & İlkeler
- ▸İstek Birleştirme aynı anda gelen mükerrer önbellek ıskalama isteklerini tek bir uçuşta birleştirir.
- ▸Go (`singleflight`), NGINX ve GraphQL DataLoader kütüphaneleriyle standartlaşmıştır.
- ▸Önbellek İzdihamı (Cache Stampede) kaynaklı veritabanı çöküşlerini tamamen ortadan kaldırır.
- ▸Yalnızca herkese açık, kimlik doğrulamasız ve idempotent GET uç noktalarında kullanın.
Yaygın Yanılgılar
- ✗Yanılgı: Önbellek süresini (TTL) uzatmak izdihamı engeller (Gerçek: Uzun süre sadece çöküşü geciktirir; anahtarın süresi yüksek yük altında bittiğinde sistem yine çöker).
- ✗Yanılgı: İstek birleştirme harici bir veritabanı kilidi gerektirir (Gerçek: Singleflight tamamen API Gateway veya uygulama katmanında bellek içinde sıfır veritabanı yüküyle çalışır).
Karar Kılavuzu & Önceliklendirme
Veritabanlarını önbellek izdihamlarına karşı korumak için tüm yüksek trafikli okuma uç noktalarında API Gateway ve servis sınırlarında Singleflight istek birleştirme uygulayın.
Doğrulanmış Kaynaklar & Referanslar
- [OFFICIAL_DOCUMENTATION]Package singleflight: Duplicate Function Call Suppression— Go Standard Library Sub-repositories (Google)
