⚡ÖZET VE TEKNİK CEVAP
Yüksek trafikli mikroservislerde, bir istemci (Node.js fetch, Go http.Client, Python requests) bağlantıları yeniden kullanmak yerine her dış API çağrısında yeni bir TCP bağlantısı açıp kapattığında, kapatma işlemini başlatan taraf TCP standardı (RFC 793) gereği TIME_WAIT durumuna girer. İnternette geciken paketlerin yeni bağlantılara karışmasını önlemek için soket 60 saniye boyunca (2 imes ext{MSL}) kilitli tutulur. Ancak Linux işletim sisteminde dışarıya doğru açılabilecek geçici port sayısı yalnızca ~28.000 adettir (ip_local_port_range). Aynı hedef sunucuya saniyede 470'ten fazla yeni istek atıldığında tüm yerel portlar TIME_WAIT ile kilitlenir. Çekirdek yeni bağlantı açmayı Cannot assign requested address (EADDRNOTAVAIL) hatasıyla reddeder ve tüm dış servis çağrıları çöker. Kesin çözüm, kalıcı HTTP Keep-Alive bağlantı havuzu (connection pooling) kullanmaktır.
Mühendislik El Kitabı & Mekanizma
6 Boyutlu Mimari Analiz⚙️1. Temel Çalışma Mekanizması
Mekanizma🎯2. Doğru Kullanım Senaryosu
Kapsam⚠️3. Prodüksiyon Arıza Modları
Kritik Risk📡4. Teşhis ve Telemetri Sinyalleri
Metrikler🛡️5. Önleme ve Mimari Bariyerler
Bariyerler⚖️6. Mimari Ödünleşimler (Trade-offs)
ÖdünleşimVaka İncelemesi (TinyCTO Saha Örneği)
Bir ödeme servisi saniyede 600 istek yük altında EADDRNOTAVAIL hatası vererek çöküyordu. İncelemede Go kodunun her gelen HTTP isteği için fonksiyon içinde yeni bir &http.Client{} açtığı ve 45 saniyede 28.000 portu kilitlediği keşfedildi. Ekip tek bir global http.Client singleton havuzuna geçti (MaxIdleConnsPerHost = 100). TIME_WAIT durumundaki 28.000 soket bir anda sadece 45 adet kalıcı bağlantıya dönüştü ve servis saniyede 15.000 isteğe sıfır hatayla çıktı.
İnteraktif Konsept Alıştırmaları
2 AlıştırmaLinux çekirdeğindeki 'Cannot assign requested address' (EADDRNOTAVAIL) hatasının temel sebebi nedir?
HTTP Keep-Alive bağlantı havuzu `TIME_WAIT` soket tükenmesini nasıl engeller?
Soket Açlığı: TIME_WAIT Birikmesi ve Geçici Port (Ephemeral Port) Tükenmesi — Sıkça Sorulan Sorular
Modern bulut mimarilerinde `net.ipv4.tcp_tw_recycle` ayarı neden tehlikelidir?
Aynı IP'den gelen paketlerin zaman damgalarını karşılaştırır: NAT veya yük dengeleyici arkasındaki birden fazla kullanıcının paketleri zaman farkı yüzünden sessizce düşürülür.
`net.ipv4.tcp_tw_reuse` parametresinin görevi nedir?
Linux çekirdeğinin, giden yeni bir bağlantı için `TIME_WAIT` durumundaki bir soketi TCP sıra güvenliği açısından sakınca yoksa yeniden kullanmasına izin verir.
🤖 AEO & Yapay Zeka Çıkarım Özeti
Temel Gerçekler & İlkeler
- ▸
Opening short-lived TCP connections locks sockets in
TIME_WAITfor 60 seconds. - ▸
Linux has ~28,000 ephemeral ports, capping unpooled outbound rates to ~470 req/sec.
- ▸
Port starvation triggers fatal
Cannot assign requested address(EADDRNOTAVAIL) errors. - ▸
Always reuse persistent HTTP Keep-Alive connection pools across all outbound HTTP clients.
Yaygın Yanılgılar
- ✗
Yanılgı: Ephemeral port exhaustion is caused by incoming customer traffic (Gerçek: It is caused by OUTBOUND client calls made by your backend to DBs/APIs).
- ✗
Yanılgı: Creating a new HTTP client object per request is good practice (Gerçek: It causes severe socket leakage; always use a global singleton).
Karar Kılavuzu & Önceliklendirme
Ensure all HTTP client libraries use a global singleton connection pool with Keep-Alive. Set net.ipv4.ip_local_port_range = 10240 65535 and net.ipv4.tcp_tw_reuse = 1 via sysctl.
Doğrulanmış Kaynaklar & Referanslar
- [OFFICIAL_DOCUMENTATION]RFC 793: Transmission Control Protocol & TIME_WAIT State Machine— Internet Engineering Task Force (IETF)
