JSON ve ikili payloadlar için ZSTD, Brotli ve GZIP'i karşılaştırın: hız, sıkıştırma oranı, CPU maliyeti ve üretimde uygulanabilecek varsayılanlar.

API yanıt sıkıştırması, sunucunuzun yanıt gövdesini (çoğunlukla JSON) ağ üzerinden göndermeden önce daha küçük bir bayt dizisine kodlaması demektir. İstemci (tarayıcı, mobil uygulama, SDK veya başka bir servis) sonra bunu açar. HTTP üzerinde bu, Accept-Encoding (istemcinin neyi desteklediği) ve Content-Encoding (sunucunun seçtiği) gibi başlıklarla müzakere edilir.
Sıkıştırma size başlıca üç şey kazandırır:
Takas basit: sıkıştırma bant genişliğini kurtarır ama CPU (sıkıştırma/açma) ve bazen bellek (tamponlar) maliyeti getirir. Değerli olup olmadığı darboğazınıza bağlıdır.
Sıkıştırma genellikle şu durumlarda parlar:
Büyük JSON listeleri (kataloglar, arama sonuçları, analizler) döndürüyorsanız, sıkıştırma genellikle kolay kazanımlardan biridir.
Sıkıştırma genellikle CPU için kötü bir kullanım olurken:
ZSTD vs Brotli vs GZIP arasında seçim yaparken pratik karar genellikle üçe dayanır:
Bu makaledeki her şey, bu üçünü API'nizin ve trafik şeklinizin koşullarına göre dengeleme hakkındadır.
Üçü de yükü küçültür, ama farklı kısıtlamalar için optimize ederler—hız, sıkıştırma oranı ve uyumluluk.
ZSTD hızı: API'niz uç gecikmeye duyarlıysa veya sunucular CPU açısından yoğun ise iyi bir seçimdir. Orta-büyük JSON yanıtları için yeterince hızlı sıkıştırabilir; genel olarak ağ zamanına karşı ihmal edilebilir bir ek yük oluşturur.
Brotli sıkıştırma oranı: Bant genişliği birincil kısıtlama ise (mobil istemciler, pahalı egress, CDN ağırlıklı dağıtım) ve yanıtlar çoğunlukla metinse Brotli kazandırır. Daha küçük payloadlar bile sıkıştırma maliyeti karşılığında değerli olabilir.
GZIP uyumluluğu: Maksimum istemci desteği gerektiğinde (eski SDK'lar, gömülü istemciler, miras proxy'ler) en güvenli seçimdir. En iyi performans olmasa bile genelde yanlış bir tercih değildir.
Sıkıştırma “seviyeleri”, CPU zamanı ile daha küçük çıktı arasında tercih yapar:
Açma genelde her üçü için sıkıştırmadan daha ucuzdur, ama çok yüksek seviyeler istemci CPU/batarya üzerinde etkili olabilir—mobil cihazları düşünün.
Sıkıştırma sıkça “daha küçük yanıtlar = daha hızlı API” olarak satılır. Bu çoğu zaman yavaş veya pahalı ağlarda doğrudur—ama otomatik değildir. Eğer sıkıştırma sunucu CPU zamanını yeterince artırırsa, ağda daha az bayt olsa bile isteğiniz daha yavaş olabilir.
İki maliyeti ayırmak faydalıdır:
Yüksek sıkıştırma oranı transfer süresini azaltabilir, fakat sıkıştırma her isteğe 15–30 ms ekliyorsa, hızlı bağlantılarda kazandığınızdan fazlasını kaybedebilirsiniz.
Yük altındayken sıkıştırma p95/p99 gecikmesini p50'den daha çok bozabilir. CPU kullanımı tırmandığında istekler kuyruklanır. Kuyruklanma küçük isteğe bağlı maliyetleri büyük gecikmelere çevirir—ortalama iyi görünürken en yavaş kullanıcılar zarar görür.
Tahmin etmeyin. A/B testi veya kademeli açılış yapın ve karşılaştırın:
Gerçekten “en iyi” seviye, toplam süreyi azaltandır, sadece baytları küçültmek değildir.
Sıkıştırma “bedava” değildir—işi ağdan CPU ve belleğe kaydırır. API'lerde bu, daha yüksek istek işleme zamanı, daha büyük bellek tepe değerleri ve bazen istemci tarafında yavaşlamalar şeklinde görülür.
Çoğu CPU sıkıştırmada yanıtları sıkıştırırken harcanır. Sıkıştırma desenleri bulur, durum/sözlük oluşturur ve kodlanmış çıktıyı yazar.
Açma genelde daha ucuzdur ama yine de önemlidir:
API'niz zaten CPU sıkışmışsa (yoğun uygulama sunucuları, ağır kimlik doğrulama, pahalı sorgular), yüksek seviye sıkıştırma kuyruğu arttırabilir.
Sıkıştırma bellek kullanımını birkaç şekilde artırabilir:
Konteyner ortamlarında daha yüksek tepe bellek OOM kill'lere veya sıkı sınırlara yol açarak yoğunluğu düşürebilir.
Sıkıştırma her yanıt için CPU döngüleri ekler, bu da bir instance başına düşen iş hacmini azaltır. Bu autoscaling'i tetikleyebilir ve maliyetleri yükseltebilir. Yaygın desen: bant düşer ama CPU harcaması artar—doğru seçim, hangi kaynağın nadir olduğuna bağlıdır.
Mobil veya düşük güçlü cihazlarda açma, render, JavaScript çalıştırma ve batarya ile yarışır. Bir format birkaç KB kurtarıyorsa ama açması daha uzun sürüyorsa, özellikle “kullanılabilir veri zamanı” önemliyse yavaş hissettirebilir.
Zstandard (ZSTD) modern bir sıkıştırma formatıdır; iyi bir sıkıştırma oranı sunarken API'nizi yavaşlatmamak için tasarlanmıştır. Birçok JSON-ağırlıklı API için güçlü bir “varsayılan”tır: GZIP'e göre belirgin şekilde daha küçük yanıtlar, benzer veya daha düşük gecikme ve istemcide çok hızlı açma.
ZSTD, uçtan uca süreye (sadece en küçük baytlara değil) önem verdiğinizde en değerlidir. Hızlı sıkıştırma ve çok hızlı açma eğilimindedir—istek işleme sırasında her milisaniyenin önemi olduğu API'lerde yararlıdır.
Çeşitli payload boyutlarında da iyi çalışır: küçük-orta JSON anlamlı kazanç görür; büyük yanıtlar daha da fayda sağlar.
Çoğu API için düşük seviyelerle (genelde seviye 1–3) başlamak uygundur. Bunlar genelde en iyi gecikme/boyut dengesini verir.
Daha yüksek seviyeleri yalnızca şu durumlarda kullanın:
Pragmatik yaklaşım: düşük global bir varsayılan, sonra birkaç “büyük yanıt” uç noktası için seçici yükseltme.
ZSTD akışları destekler; bu, büyük yanıtlar için tepe belleği azaltabilir ve daha erken veri göndermeyi sağlar.
Sözlük modu, birçok benzer nesne döndüren API'lerde (tekrar eden anahtarlar, sabit şemalar) büyük kazanç sağlayabilir. Etkili olduğu durumlar:
Sunucu tarafı desteği birçok yığında basittir, ama istemci uyumluluğu belirleyici olabilir. Bazı HTTP istemcileri, proxy'ler ve gateway'ler Content-Encoding: zstd'i varsayılan olarak bildirmeyebilir veya kabul etmeyebilir.
Üçüncü taraf tüketicilere hizmet veriyorsanız bir yedek (genelde GZIP) tutun ve yalnızca Accept-Encoding açıkça içeriyorsa ZSTD etkinleştirin.
Brotli metni çok iyi sıkıştırmak için tasarlanmıştır. JSON, HTML ve diğer “kelimeli” payloadlarda genelde GZIP'i geçer—özellikle yüksek sıkıştırma seviyelerinde.
Metin ağırlıklı yanıtlar Brotli'nin güçlü olduğu alandır. Büyük JSON dokümanları (kataloglar, arama sonuçları, yapılandırma blob'ları) gönderiyorsanız, Brotli baytları belirgin şekilde azaltabilir; bu yavaş ağlarda ve egress maliyetini düşürmede yardımcı olur.
Brotli, bir kez sıkıştırılıp birçok kez servis edilen içeriklerde (önbelleğe alınabilir yanıtlar, versiyonlanmış kaynaklar) de güçlüdür. Bu durumda yüksek seviyeli Brotli CPU maliyeti birçok isteğe amorti edilebilir.
Dinamik API yanıtları (her istekte üretilen) için Brotli'nin en iyi oranları genelde daha yüksek seviyelerde gelir ve bunlar CPU açısından maliyetli olabilir. Sıkıştırma süresini hesaba kattığınızda ZSTD veya iyi ayarlanmış bir GZIP'e karşı gerçek dünya avantajı beklenenden küçük olabilir.
Ayrıca iyi sıkışmayan payloadlar (zaten sıkıştırılmış veriler, bazı ikili formatlar) için çekici değildir—bu durumda sadece CPU yakarsınız.
Tarayıcılar HTTPS üzerinde Brotli'yi genelde iyi destekler; bu yüzden web trafiği için popülerdir. Tarayıcı dışı API istemcilerinde (mobil SDK'lar, IoT cihazlar, eski HTTP yığınları) destek tutarsız olabilir—dolayısıyla Accept-Encoding ile doğru müzakere edin ve bir yedek (genelde GZIP) tutun.
GZIP, API sıkıştırması için varsayılan cevap olmaya devam ediyor çünkü en evrensel olarak desteklenen seçenektir. Neredeyse her HTTP istemcisi, tarayıcı, proxy ve gateway Content-Encoding: gzip'i anlar; bu öngörülebilirlik üçüncü taraflarla çalışırken önemlidir.
Avantajı GZIP’in “en iyi” olması değil—genelde yanlış seçim olmamasıdır. Birçok kuruluş uzun yıllardır operasyonel deneyime sahip, web sunucularında mantıklı varsayılanlar ve yeni kodlamaları kötü ele alan ara katmanlarla daha az sürpriz yaşar.
API yükleri (çoğunlukla JSON) için orta-düşük seviyeler tatlı nokta olur. Seviye 1–6 çoğunlukla makul boyut indirimi verirken CPU'yu makul tutar.
Çok yüksek seviyeler (8–9) biraz daha sıkıştırma verebilir ama dinamik istekte gecikmeyi genelde karşılamaz.
Modern donanımda GZIP genelde benzer sıkıştırma oranındaki ZSTD'den daha yavaştır ve metin için Brotli'nin en iyi oranlarına genelde yetişemez. Gerçek API iş yüklerinde bu tipik olarak şunu gösterir:
Eski istemcileri, gömülü cihazları, katı kurumsal proxy'leri veya miras gateway'leri desteklemeniz gerekiyorsa GZIP en güvenli tercihtir. Bazı ara katmanlar bilinmeyen kodlamaları çıkarabilir, iletimini bozabilir veya müzakerede hata yapabilir—GZIP ile bu sorunlar daha az görülür.
Ortamınız karışık veya belirsizse, GZIP ile başlayıp yalnızca tam yolu kontrol ettiğiniz yerlerde ZSTD/Brotli eklemek güvenli bir stratejidir.
Sıkıştırma kazanımları sadece algoritmaya bağlı değildir. En büyük belirleyici gönderdiğiniz verinin türüdür. Bazı payloadlar ZSTD, Brotli veya GZIP ile dramatik şekilde küçülür; bazıları neredeyse hiç değişmez ve sadece CPU yakar.
Metin ağırlıklı yanıtlar tekrarlayan anahtarlar, boşluk ve öngörülebilir kalıplar içerdiği için çok iyi sıkışır:
Tekrarlama ve yapı arttıkça sıkıştırma oranı genelde artar.
Protobuf ve MessagePack gibi ikili formatlar JSON'dan daha kompakt olsa da genelde “rastgele” değildir. Yine de tekrar eden etiketler, benzer kayıt düzenleri ve öngörülebilir diziler içerebilirler.
Bu yüzden bunlar çoğunlukla halen sıkıştırılabilir, özellikle büyük yanıtlar veya liste ağırlıklı uç noktalar için. Kesin cevap, gerçek trafiğinizle test etmektir: aynı endpoint, aynı veri, sıkıştırma açık/kapalı ve boyut ile gecikmeyi karşılaştırın.
Birçok format zaten dahili olarak sıkıştırılmıştır. HTTP düzeyinde tekrar sıkıştırma genelde çok az kazanç sağlar veya yan etkilere yol açar:
Bunlar için içerik türüne göre sıkıştırmayı devre dışı bırakmak yaygındır.
Basit bir yaklaşım: yanıtlar belirli bir minimum boyut eşiğini aştığında sıkıştırın.
Bu, CPU'yu gerçekten bant genişliği kazandıran yüklerde tutar.
Sıkıştırma istemci ve sunucunun bir kodlamada anlaşmasıyla düzgün çalışır. Bu anlaşma Accept-Encoding (istemci) ve Content-Encoding (sunucu) ile olur.
Bir istemci hangi kodlamayı açabileceğini belirtir:
GET /v1/orders HTTP/1.1
Host: api.example
Accept-Encoding: zstd, br, gzip
Sunucu birini seçer ve ne kullandığını bildirir:
HTTP/1.1 200 OK
Content-Type: application/json
Content-Encoding: zstd
Eğer istemci Accept-Encoding: gzip gönderip siz Content-Encoding: br ile yanıt verirseniz, istemci gövdeyi işleyemeyebilir. İstemci Accept-Encoding göndermediyse en güvenli varsayılan genelde sıkıştırma olmamasıdır.
API'ler için pratik bir öncelik genelde şudur:
zstd (hız/oran dengesi iyi)br (genelde daha küçük, bazen daha yavaş)gzip (en geniş uyumluluk)Yani: zstd > br > gzip.
Bu evrensel bir kural değildir: trafiğiniz büyük oranda tarayıcılardan geliyorsa br daha yüksek öncelik alabilir; eski mobil istemciler yoğunsa gzip daha güvenli olabilir.
Eğer bir yanıt birden fazla kodlama ile sunulabiliyorsa, ekleyin:
Vary: Accept-Encoding
Bunu yapmazsanız CDN veya proxy gzip (veya zstd) versiyonunu önbelleğe alıp bunu ilgili başlığı istemeyen istemcilere sunabilir.
Bazı istemciler destek bildirir ama hatalı çözücülere sahiptir. Sağlam kalmak için:
zstd için decode hataları artarsa geçici olarak gzip'e geri dönün.Müzakere, her baytı sıkıştırmaktan çok istemciyi kırmamaya odaklıdır.
API sıkıştırması tek başına çalışmaz. Taşıma protokolünüz, TLS yükü ve aradaki CDN veya gateway gerçek dünya sonucunu değiştirebilir—ve yanlış yapılandırıldığında işleri bozabilir.
HTTP/2 ile tek bir TCP bağlantısı üzerinden birden çok istek gider. Bu bağlantı yükünü düşürür ama paket kaybı tüm akışları durdurabilir (TCP head-of-line blocking). Sıkıştırma, yanıt gövdelerini küçülterek paket kaybı arkasında “takılı kalan” veriyi azaltmaya yardımcı olabilir.
HTTP/3 QUIC (UDP) üzerinde çalışır ve akışlar arasında TCP seviyesinde head-of-line blokajı yaşamaz. Yine de payload boyutu önemlidir; kayıp cezası bağlantı başına genelde daha azdır. Pratikte sıkıştırma hâlâ değerlidir—fayda daha çok bant tasarrufu ve daha hızlı “time to last byte” olarak görünür.
TLS zaten CPU tüketir (el sıkışmalar, şifreleme/şifre çözme). Yüksek seviyede sıkıştırma eklemek CPU limitlerini aşmanıza neden olabilir. Bu yüzden üretimde genelde “hızlı sıkıştırma ve makul oran” ayarları maksimum oran hedefleyen ayarlardan daha iyi işler.
Bazı CDN/gateway'ler belirli MIME türlerini otomatik sıkıştırır; bazıları origin'in gönderdiğini olduğu gibi geçirir. Birkaçı yanlış yapılandırıldığında Content-Encoding'i normalleştirebilir veya kaldırabilir.
Her rota için davranışı doğrulayın ve Vary: Accept-Encoding başlığının korunmasını sağlayın.
Edge'de önbelleğe alıyorsanız, her kodlama için ayrı varyantlar saklamayı (gzip/br/zstd) düşünün; her istekte yeniden sıkıştırmak yerine. Origin'de önbellek varsa, edge yine müzakere edip birden fazla kodlamayı önbelleğe alabilir.
Anahtar nokta tutarlılıktır: doğru Content-Encoding, doğru Vary, ve sıkıştırmanın nerede yapıldığının net olması.
Accept-Encoding ile bildiriyorsa Brotli tercih edin. Tarayıcılar Brotli'yi genelde verimli çözer ve metin yanıtlarında daha iyi boyut indirimi sağlar.Başlamak için ölçülmesi kolay ve sürpriz yapma ihtimali düşük seviyeler:
Daha güçlü oran gerekiyorsa, üretime benzer örneklerle doğrulayın ve p95/p99'u izleyin.
Küçük yanıtları sıkıştırmak CPU'yu bayt kazancından daha pahalıya mal edebilir. Pratik başlangıç:
Bunu, (1) kaydedilen baytlar, (2) ek sunucu zamanı ve (3) uçtan uca gecikme değişimi ile karşılaştırarak ayarlayın.
Sıkıştırmayı bir özellik bayrağı arkasında açın, sonra rota bazlı konfigürasyon ekleyin (örn. /v1/search için aç, küçük uç noktalar için kapat). Sorun giderme ve uç istemciler için Accept-Encoding: identity ile istemci-taraflı opt-out sağlayın. Önbellek doğruluğu için her zaman Vary: Accept-Encoding ekleyin.
Hızla prototip çıkartan ekiplerde sıkıştırma, genelde “küçük bir konfigürasyon, büyük etki” düğmesidir. Koder.ai üzerinde ekipler bu noktaya daha erken gelir çünkü tam yığın uygulamaları hızlıca dağıtıp gerçek trafikle ayarları (sıkıştırma ve önbellek başlıkları dahil) inceleyebilirler. Sonuç: sıkıştırmayı bir performans özelliği olarak ele alın, bayrakla açın ve p95/p99'u ölçün.
Sıkıştırma değişiklikleri kolay gönderilebilir ama üretimde yanlış yapılması da kolaydır. Bunu bir özellik gibi ele alın: kademeli dağıtın, etkisini ölçün ve geri almayı basit tutun.
Önce bir canary ile başlayın: yeni Content-Encoding (ör. zstd)'i küçük bir trafik dilimine veya tek bir dahili istemciye açın.
Sonra kademeli arttırın (ör. %1 → %5 → %25 → %50 → %100), kritik metrikler tersine dönerse duraklayın.
Hızlı geri alma yolları bulundurun:
gzip'e düşürme için özellik bayrağıSıkıştırmayı hem performans hem güvenilirlik değişikliği olarak izleyin:
Bir şey bozulduğunda sık görülen nedenler:
Content-Encoding var ama gövde sıkıştırılmamış (veya tersi)Accept-Encoding yok sayıldı veya istemcinin bildirmediği bir kodlama döndürüldüContent-Length, proxy/CDN müdahalesiDesteklenen kodlamaları belgelerinizde net yazın, örneklerle:
Accept-Encoding: zstd, br, gzipContent-Encoding: zstd (veya yedek)SDK'lar gönderiyorsanız, küçük yapıştır-kullan açma örnekleri ekleyin ve Brotli veya Zstandard desteği için gereken minimum sürümleri belirtin.
Cevap: Cevap sıkıştırmasını, yanıtlar metin ağırlıklı (JSON/GraphQL/XML/HTML), orta-büyük boyutta olduğunda ve kullanıcılarınız yavaş/masraflı ağlar kullanıyorsa veya anlamlı egress maliyeti ödüyorsanız etkinleştirin. Küçük yanıtlar, zaten sıkıştırılmış medya (JPEG/MP4/ZIP/PDF) ve ek işlem yaptığında p95/p99 gecikmesini kötüleştirebilecek CPU sınırındaki servisler için bunu atlayın veya yüksek bir eşik kullanın.
Cevap: Çünkü bu işlem bant genişliğini CPU (ve bazen bellek) ile takas eder. Sıkıştırma zamanı sunucunun byte göndermeye başlamasını (TTFB) geciktirebilir ve yük altındayken kuyruklanmayı arttırarak—ortalama gecikme düzelse bile—kuyruk/uç gecikmeyi kötüleştirebilir. En iyi ayar, sadece baytları değil, uçtan uca süreyi azaltandır.
Cevap: Birçok API için pratik öncelik şu şekildedir:
zstd ilk (hızlı, iyi oran)br (metin için genellikle en küçük, CPU daha pahalı olabilir)gzip (en geniş uyumluluk)Her zaman istemcinin başlığında ne bildirdiğine göre karar verin ve güvenli bir yedek (genellikle veya ) tutun.
Cevap: Düşük seviyeden başlayın ve ölçün.
Cevap: Küçük yanıtlar için CPU harcamamak üzere bir minimum yanıt boyutu eşiği kullanın.
Her uç nokta için kaydedilen baytları, eklenen sunucu zamanını ve p50/p95/p99 üzerindeki etkisini karşılaştırarak ayarlayın.
Cevap: Sıkıştırma en çok tekrarlayan ve yapılandırılmış içeriklerde işe yarar:
Cevap: Sıkıştırma HTTP pazarlığı ile yapılmalıdır:
Accept-Encoding gönderir (ör. zstd, br, gzip)Content-Encoding ile cevap verirİstemci göndermiyorsa, en güvenli cevap genellikle olandır. İstemcinin bildirmediği bir döndürmeyin; aksi takdirde istemci gövdeyi işleyemeyebilir.
Cevap: Ekleyin:
Vary: Accept-EncodingBu, CDN/proxy'nin örneğin gzip versiyonunu önbelleğe alıp bunu gzip istemeyen veya çözemeyen bir istemciye yanlışlıkla sunmasını engeller. Birden fazla kodlama destekliyorsanız bu başlık doğru önbellekleme için zorunludur.
Cevap: Yaygın hata senaryoları şunlardır:
Cevap: Bunu bir performans özelliği gibi dağıtın:
Accept-EncodinggzipidentityDaha yüksek seviyeler genelde azalan getiri sağlar ve CPU/p95/p99'u kötüleştirebilir.
Yaygın yaklaşım: sadece metin-benzeri Content-Type değerleri için sıkıştırmayı etkinleştirmek ve zaten sıkıştırılmış formatlar için kapatmaktır.
Accept-EncodingContent-EncodingContent-Encoding sıkıştırma olduğunu söylüyor ama gövde sıkıştırılmamış)Accept-Encoding yok sayılıyor)Content-Length hataları, kesik gövde)Hata ayıklarken ham yanıt başlıklarını yakalayın ve bilinen bir araç/istemci ile açmayı doğrulayın.
Yük altındaki kuyruklanma artarsa, seviyeyı düşürün, eşiği yükseltin veya daha hızlı bir kodeke (çoğu zaman ZSTD) geçin.