HTTP/2 ve HTTP/3 (QUIC) API performansını nasıl etkiler?
Soru
Mobil uygulamamız tek ekranda profil, bildirim, sepet ve önerileri çekmek için API'ya 4-5 isteği aynı anda atıyor. HTTP/1.1'de bağlantı limitleri ve head-of-line blocking yüzünden ekran geç doluyor; domain sharding ile uğraşıyoruz. Altyapıyı HTTP/2 ya da HTTP/3'e taşımanın mimari faydası ne olur? Nginx/Caddy katmanında TLS handshake'ini nasıl optimize ederim?
Cevap
Kısa cevap: Tek ekrandaki 4-5 paralel istek sizin için HTTP/2’nin en güçlü olduğu senaryo — hemen açın; mobil kitle ağırlıktaysa HTTP/3 ile devam edin.
Kısa cevap
Yaşadığınız şey protokol seviyesinde bir darboğaz: HTTP/1.1 her host’a sınırlı sayıda bağlantı açar ve aynı bağlantıdaki bir istek ötekini bekletir (head-of-line blocking). Domain sharding bunu kapatmak için uydurulmuş bir hile; çözüm değil, semptom. Aynı “kullanıcıya en yakın yerden hızlı dön” hedefinin önbellek tarafını edge cache ve invalidation kaydında ele almıştım.
Neden
-
HTTP/2 çoklamayı tek bağlantıya indirir. 4-5 isteğin tamamı tek TCP+TLS bağlantısı üzerinden eşzamanlı akar; “host başına 6 bağlantı” limiti kalkar, domain sharding’e gerek kalmaz. Üstüne HPACK header sıkıştırması var — “ekran başına çok sayıda küçük istek” deseninde tekrar eden header’lar neredeyse bedavaya gelir.
-
HTTP/2’nin kör noktası TCP seviyesinde HOL blocking’dir. Çoklama HTTP katmanında; altta tek bir TCP akışı var. Bir paket düşerse o paket yeniden gelene kadar tüm stream’ler bekler. Sağlam Wi-Fi’da fark etmez; paket kaybının yüksek olduğu mobil ağda geri vurur.
-
HTTP/3 (QUIC) bu kör noktayı kapatır. QUIC UDP üzerinde çalışır ve her stream’i bağımsız taşır; bir paket kaybı sadece o stream’i etkiler. Bağlantı kurulumu da daha hızlıdır (TLS handshake’i QUIC’e gömülü,
0-RTTile resumption).
Ne yapmalı
-
Önce HTTP/2’yi açın. Ucuz, geriye dönük uyumlu, mevcut darboğazın çoğunu hemen çözer. Caddy’de hazır; Nginx’te 1.25.1’den beri ayrı bir
http2 on;direktifi var (varsayılan kapalı). -
Mobil kitle ağırlıktaysa HTTP/3’ü ekleyin. Caddy’de varsayılan; Nginx’te HTTP/3 modülü 1.25.0’dan beri var ama deneysel ve varsayılan derlemede yok —
--with-http_v3_moduleile derlenmiş bir binary gerekiyor, sonralisten 443 quic;ile açılıyor. -
Handshake’i ucuzlatın. TLS’i edge’de sonlandırın,
keep-alive’ı koruyun,OCSP staplingve TLS session resumption (session ticket) ile her bağlantıda yeniden el sıkışmayı engelleyin. -
Domain sharding’i tamamen kaldırın. Çoklamanın işe yaraması için tek origin’de toplayın; sharding’i geri sokarsanız HTTP/2’nin faydasını kendi elinizle iptal edersiniz.
Sonuç: Ben olsam önce HTTP/2’yi açardım, sonra mobil kitle için HTTP/3’ü eklerdim; QUIC’in stream-bazlı bağımsızlığı ve hızlı kurulumu, kötü ağda kullanıcının hissettiği farktır. Tek origin, açık keep-alive, stapling ve session resumption — handshake maliyetini buradan kısarsınız. Domain sharding ise HTTP/2 dünyasında artık bir anti-pattern.
Yorumlar
Yorum yapmak için GitHub hesabınızla giriş yapmanız yeterli. Yorumlar GitHub Discussions üzerinde saklanır.