İçindekiler
- 1 Ofiste Küçük Bir Sarsıntı: Görseller, CDN ve O Kaçan Fatura
- 2 Görselin Parası: Byte’lar Neden Bu Kadar Ağır?
- 3 AVIF ve WebP: Nereye, Ne Zaman, Nasıl?
- 4 Boyutlandırma: Kaç Piksel Kime Yeter?
- 5 Cache-Key Disiplini: Kaos Değil, Akıl
- 6 Origin Shield: Orijine Bir Siper, POP’lara Huzur
- 7 Uçtan Uca Bir Boru Hattı: Akış Nasıl Oturur?
- 8 Tuzaklar: Küçük Hatalar, Büyük Faturalar
- 9 Ölçüm: Ne Kadar Isındık, Ne Kadarı Cebe Kaldı?
- 10 Kalite Ayarı: Göz Terazisi, Byte Tasarrufu
- 11 Güvenli Kenarlar: İmzalı URL, Geçersiz Kılma ve Sürümleme
- 12 Son Rötuşlar: Kişiselleştirme, Dinamik Metin ve Görsel Katmanları
- 13 Kapanış: Sade Kurallar, Yumuşak Bir Fatura
Ofiste Küçük Bir Sarsıntı: Görseller, CDN ve O Kaçan Fatura
Hiç başınıza geldi mi? Bir pazartesi sabahı kahvenizi alıp panoya bakıyorsunuz ve CDN faturası ufak bir dağ gibi beliriyor. Benim başıma geldi. Ürün liste sayfası, bol görsel, şık bir tasarım; her şey yerli yerindeydi sanki. Ama loglara şöyle bir dalınca, aynı görselin onlarca varyantla farklı parametrelerde istenip önbelleği parçaladığını gördüm. Kalite değeri değişmiş, genişlik parametresi ayrı takılmış, format seçimi tamamen şansa bırakılmış. Ortaya çıkan şey şu: küçük küçük kararlar, büyük büyük byte’lara dönüşüyor.
O gün şunu fark ettim: Görüntü optimizasyonu sadece ‘resmi sıkıştır’ meselesi değil. Doğru formatı doğru cihaza vermek, tutarlı bir cache-key politikası oluşturmak ve Origin Shield ile orijini korumak birlikte bir hikâye anlatıyor. Bu yazıda, görüntü optimizasyonu boru hattını baştan sona, koddan çok mantığı konuşarak kuracağız. Nerede sağa çekip nefes alacağımızı, nerede gaza basacağımızı beraber göreceğiz. Sonunda amacımız basit: kaliteyi korurken CDN maliyetini nazikçe aşağı çekmek.
Görselin Parası: Byte’lar Neden Bu Kadar Ağır?
Mesela şöyle düşünün: Müşteriniz katalog sayfasında geziniyor. Gözünün gördüğü her ürün kutucuğu bir istek demek; her istek de bir taşıma maliyeti. Görselin kendisi büyükse, taşıdığınız yük büyüyor. Görsel sayısı artınca, aynı hikaye katlanıyor. Bir de her cihaz ve tarayıcıya farklı bir varyant göndermek için desen desen parametre ürettiğinizde, CDN’in ön belleği parçalanıyor. Yani, çok sayıda benzersiz anahtar, daha az isabet oranı, daha çok orijin isteği demek.
Asıl mesele şu: Maliyet çoğu zaman CPU’dan değil, taşıdığınız bayt ve kaçırdığınız cache isabetlerinden gelir. Görselin formatını akıllıca seçmek, boyutunu kullanıcıya göre ayarlamak ve cache anahtarlarını disipline etmek bu yüzden güçlü üçlü. Üçü el ele verince, aynı sayfa daha az veri harcar, daha az farklı varyasyon üretir ve orijin daha az yorulur. Tüm hamleyi bu gözle planlayalım.
AVIF ve WebP: Nereye, Ne Zaman, Nasıl?
AVIF ve WebP’nin güzelliği, daha az byte ile göze hoş gelen görüntüler sunmaları. Ama her tarayıcı her formatı aynı sevgiyle karşılamıyor. Burada yapılacak şey zor değil: tarayıcının neyi kabul ettiğini anlayıp ona göre cevap vermek. Tarayıcı ‘AVIF severim’ diyorsa AVIF verirsiniz, ‘WebP de olur’ diyorsa WebP, ‘ben klasikçiyim’ diyenlere de JPEG/PNG. Bu, içten içe bir pazarlık gibi; her istemciyle küçük bir anlaşma.
Format seçimini basitleştirmenin yolu, içerik anlaşması mantığıyla ilerlemek. İstek üstbilgilerinde tarayıcının kabul ettiği formatları okuyup, tek bir kalite aralığında standardize ettiğiniz AVIF/WebP çıktıyı verin. Fazla varyasyon peşinde koşmayın; iş kaliteden çalmaz, ama önbellek daha düzenli kalır. AVIF’in detaylarda daha usta olduğu, WebP’nin yaygın cihazlarda tatlı bir denge sunduğu bir gerçek. Yine de herkes için tek bir doğru yok; kendinize bir ana rota belirleyin ve küçük güncellemelerle ilerleyin.
Daha teknik okumayı sevenler için, formatların temelini anlatan kaynaklar da aklımda. MDN üzerinde AVIF bölümünü incelemek ufuk açar. WebP tarafında ise Google’ın WebP sayfası pratik ipuçlarıyla dolu. Ama kağıt üstündeki bilgiyi sahaya sürmek için asıl ihtiyacınız, kendi görsellerinizle küçük denemeler yapmak. Bir-iki sayfa, birkaç kalite ayarı, üç beş cihaz. Sonra sonuçlar zaten konuşur.
Boyutlandırma: Kaç Piksel Kime Yeter?
Görselleri büyütüp küçültme işinde gereğinden fazla ciddileşmek, maliyeti coşturur. Her genişlik için ayrı bir varyant üretmek yerine, sembolik birkaç genişlik belirleyin. Mesela küçük, orta, büyük gibi. Böylece hem tarayıcıya seçim şansı tanırsınız, hem de arka tarafta üretilen ve saklanan varyant sayısı kontrol altında kalır. İlle de her boşluk için mükemmel kesim derdine düşmeyin; kaliteyi gözle doğrulayın, kulağınız lojistikte olsun.
Retina ekranlar işin tuzu biberi. Aynı genişlikte, farklı yoğunluklar olabilir. Bunu da boğup parametre cehennemine çevirmek yerine, iki yoğunluk civarında kalmak çoğu zaman yeter. Tarayıcılar seçim yapmayı biliyor; siz sadece makul seçenekler sunun. Görsellerin lazy-load ile sayfaya yavaş yavaş gelmesi de hem kullanıcıyı hem cüzdanı rahatlatır. İlk ekranda görünenlere öncelik verin; gerisi kullanıcı kaydırdıkça gelsin.
Boyutlandırma akışını akılda tutmanın pratik yolu şu: Önden birkaç basamak hazırlayın, tarayıcıya akıllı seçim alanı bırakın, fakat varyant sayısını disiplinli tutun. Çoğumuz parayı pikselde değil, varyasyonda kaybediyoruz.
Cache-Key Disiplini: Kaos Değil, Akıl
Bir CDN cache-key’i, o görselin kimliğidir. Kimliğe yazdığınız her farklı not, yeni bir kişi demektir. ‘width=1200’ ile ‘w=1200’ birbirinin aynısı gibi görünse de, cache anahtarı gözünde apayrı. Aynı şekilde ‘q=75’ ile ‘quality=75’ de başka bir dünya. Parametreleri normalize etmek bu yüzden kritik. Aynı şeyi aynı şekilde yazın; gereksizlerini tamamen atın. Boyut ve format çoğu senaryoda tek başına yeter. Kalite gibi hassas ayarlarda bile, sayıyı küçük bir aralıkta sabitlemek önbelleği huzurlu tutar.
Cache-key’e kullanıcıya özel bir şey karışmasın. Oturum bilgilerinin, kampanya etiketlerinin, izleme parametrelerinin görsellerle ilgisi yoksa, anahtara dahil etmeyin. Aksi halde her tıklama yeni bir varyant doğurur. URL’nin sonunda beliren fazladan işaretler, sorunun görünmez kahramanlarıdır. Ayrıca, büyük-küçük harf farkları, sonda slash olup olmaması, sıraya dizilmeyen parametreler de anında parçalanma yaratır. Hepsini bir düzene koyun, anahtarı temiz tutun.
Burada bir de içerik anlaşmasına uyan varyasyon konusu var. Tarayıcı AVIF destekliyorsa ‘format=avif’, yalnızca WebP ise ‘format=webp’, destek yoksa ‘format=jpeg’ gibi net ve tutarlı bir anahtar kuralı belirleyin. Böylece aynı görsel için üç ana kova oluşur ve her cihaz o kovadan nasibini alır. Avantajı şu: isabet oranı yükselir, orijin daha az çağrılır, maliyet iner.
Origin Shield: Orijine Bir Siper, POP’lara Huzur
Origin Shield, tek cümleyle şu: Orijininize gelen talebi tek bir kapıdan süzmek. Yani dünyanın farklı noktalarındaki CDN kenar noktaları aynı dosyayı almak istediğinde, önce bir ara katmana uğrar. O ara katman orijinden bir kez çekip, herkese aynı dosyayı dağıtır. Orijine binen yük dalga dalga yayılmak yerine, tek noktada toplanır. Darboğaz azalıp, maliyet daha öngörülebilir hale gelir.
Benim sevdiğim yaklaşım, shield katmanını orijine coğrafi olarak makul yakın bir yerde konumlandırmak. Böylece orijin ile shield arasındaki yol kısa, shield ile dünyadaki POP’lar arasındaki yol daha dengeli olur. İlk ısınma sırasında birkaç istek daha pahalı gelebilir, ama önbellek ısındıkça rahatlama başlar. Her yeni POP, ısıyı paylaşır.
Detay okumayı sevenler için pratik bir kaynak bırakayım: Cloudflare’ın Origin Shield belgeleri mantığı yalın bir dille anlatıyor. Ama inanın, uygularken işin püf noktası yine aynı: varyant sayısını sınırlı tutmak. Shield, kaosu büyütmez; ama kaosla beslerseniz mucize beklemeyin.
Uçtan Uca Bir Boru Hattı: Akış Nasıl Oturur?
Gelin, pratik bir senaryo düşünelim. Pazarlama ekibi yeni sezon görsellerini yüklüyor. Yüklenen her görsel, arka tarafta küçük bir servise düşüyor. Bu servis görseli temizliyor, EXIF’leri kırpıyor, mantıklı bir görsel kimliği üretiyor ve belirlediğiniz genişliklerde AVIF/WebP/JPEG varyantlarını hazırlıyor. Hepsi arşivde yerini alıyor. İsimler düzenli, parametreler sabit, kalite aralığı makul.
Ön yüzde, tarayıcıdan gelen isteğe bakıyorsunuz. Kabul edilen formatlar belliyse, en iyi uyumlu formata yönlendiriyorsunuz. Cihaza göre genişlik seçimi, daha toplanmış bir setten yapılıyor. Cache-key’iniz yalnızca ‘id, width, format’ üçlüsüne göre çalışıyor. İzleme etiketleri, kampanya kodları anahtarın dışında kalıyor. Sonuç mu? Farklı pazarlama kanallarından gelen trafiğin kıvılcımları önbelleği rahatsız etmiyor.
Eğer medyayı bir nesne depolamada tutuyorsanız, imzalı URL ve sonradan geçersiz kılma süreçlerini de düşünmek gerekir. Bu akışa meraklıysanız, adım adım bir yolculuk için medyayı S3’e taşıma, CDN ve imzalı URL’ler üzerine yazdığımız rehberi faydalı bulabilirsiniz. Görsel boru hattıyla el ele yürüdüğünde, hem güvenli hem ekonomik bir düzen kurulur.
Tuzaklar: Küçük Hatalar, Büyük Faturalar
En sık gördüğüm hata, parametre patlaması. Genişlikler rastgele, kalite sayıları tutarsız, format seçimi belirsiz olunca önbellek insan kalabalığına dönüyor. Herkes aynı görseli farklı bir anahtarla arıyor; sonuçta kimse kimseyi bulamıyor. Bu yüzden en başta bir sözlük belirleyin: ‘width sadece w olsun, kalite için q kullanalım, format için format yazalım’ gibi. Kimlik ortak bir dil konuşsun.
Bir başka tuzak, kullanıcıya özel etiketlerin anahtara sızması. Oturum cookie’leri, A/B testi varyantları, izleme zincirlerinin eklediği uzun uzadıya parametreler… Görselin kendisine dokunmayan hiçbir şey o anahtarda olmamalı. Gerekirse bir katman koyun ve istekten önce tüm bu fazlalıkları temizleyin. Hem güvenlik hissi artar, hem önbellek şeffaflaşır.
Son olarak, mükemmellik takıntısı bazen düşmanınız olabilir. On piksel için yeni bir varyant üretmek, ısrarla her sayfaya özel bir kalite değeri denemek, aynı formatı farklı isimlerle çağırmak… Bunlar kağıt üzerinde zararsız görünür; pratikte ise hem depolama hem transfer masraflarını kabartır. Gözle test edin, kullanıcı deneyimini sahici senaryolarla tartın ve az ama öz varyantla yürüyün.
Ölçüm: Ne Kadar Isındık, Ne Kadarı Cebe Kaldı?
Gözünüzü seveyim, ölçmeden karar vermeyin. En azından basit bir hedefiniz olsun: isabet oranı artsın, orijine giden istek azalsın, ortalama görsel boyutu düşsün. CDN raporlarında isabet grafikleri, üstten kaçan istekler ve veri transferi birlikte güzel bir hikâye anlatır. Akışa küçük dokunuşlar yaptıkça, bu grafiklerin nasıl yumuşadığını görmek moral verir.
Bazen tek bir kategori sayfası, bütün düzeni yoldan çıkarabilir. Çok farklı ebatlarda görsel kullanan bir tema, beklenmedik bir cihaz dağılımı, aşırı hareketli bir kampanya dönemi… Böyle anlarda soğukkanlı kalın. Sorun yaşayan sayfayı kısa süreliğine daha sıkı bir kurala alın, varyantları geçici olarak azaltın, gerekiyorsa birkaç kritik görseli elden geçirin. Boru hattı yaşayan bir organizma; dönem dönem nabzını tutmak gerekir.
Kalite Ayarı: Göz Terazisi, Byte Tasarrufu
Kalite denen şey çoğu zaman ekrandaki iki pikselin ilişkisi. Ona bu gözle bakınca, ‘q=82 mi, q=78 mi’ kavgası yerine, ‘bu kategoride bu kalite iş görüyor’ demek daha rahatlatıcı. Ben genelde kaliteyi içerik türüne göre çivilerim. Ürün görsellerinde bir noktada durulur, blog görsellerinde başka bir noktada. Hepsinde ortak nokta, kalite aralığını dar tutmak. Onlarca farklı sayı yerine, bir-iki sağlam basamak seçmek önbelleği okşar.
AVIF ve WebP tarafında da aynı felsefe geçerli. Tarayıcıya senkron ve tutarlı davranırsanız, kimi anlarda AVIF ile ciddi bir incelme görürsünüz; kimi anlarda WebP işinizi görür. Esas olan, ‘ben bu üç varyanttan birini veririm, hepsi kaliteli ve yeter’. Basit, anlaşılır ve uygulanabilir bir söz. Uzun vadede maliyeti düşük tutan da bu sadelik.
Güvenli Kenarlar: İmzalı URL, Geçersiz Kılma ve Sürümleme
Görselleri dışa açık bir depoda tutarken, bazen imzalı URL’ler kullanmak gerekir. İmza parametresi, cache-key’i bozmamalı. Çoğu CDN, doğrulama sonrası anahtara imza parametresini katmadan önbelleğe atabilmenizi sağlar. İmza sadece kapıda kontrol içindir; içeri giren ürün aynı ürün olmalı. Geçersiz kılma tarafında ise sürüm numarası imdadınıza yetişir. ‘/images/…/v3/…’ gibi bir düzen, tek tek dosya silmekle uğraşmadan yeni sürümü itmenizi sağlar.
İş akışını iyice düzene koyduğunuzda, bu konular birbirine bağlanıyor. Sürüm yükseldiğinde, yeni varyantlar hazırlanıyor, cache-key aynı dilde kalıyor, shield ısınıyor, POP’lar sırayla aydınlanıyor. Dışarıdan bakınca ‘ne güzel akıyor’ dediğimiz şey, içeride tutarlılığın meyvesi aslında.
Son Rötuşlar: Kişiselleştirme, Dinamik Metin ve Görsel Katmanları
Bazen görsellerin üzerinde dinamik metinler, rozetler, indirim etiketleri olur. Bu iş, önbelleği bir anda kişiselleştirme batağına çekebilir. Mümkünse görseli sabit tutun, metni ayrı bir katman olarak yerlileştirin. Ya CSS ile, ya küçük bir SVG dokunuşuyla. Görselin kendisi her yerde aynı kalsın ki, önbellek her yerde aynı ürünü satabilsin. Dinamik katman sayısı azaldıkça, maliyet de nefes alır.
Kişiselleştirmeyi seviyoruz ama her şeyi kişiselleştirmek zorunda değiliz. Görsel içerik, çoğu zaman evrensel bir dil konuşur. Pahalı olan, her kullanıcı için yeni bir görsel yontmaktır. Boru hattının havasını bozmamak için, kişisel dokunuşları metin ve arayüz katmanlarına bırakmak çoğu senaryoda daha akıllıca.
Kapanış: Sade Kurallar, Yumuşak Bir Fatura
Toplayalım. Görüntü optimizasyonu boru hattı, bir sürü küçük kararın uyum içinde atıldığı bir yürüyüş. AVIF/WebP ile formatı doğru seçmek görselleri inceltir, cache-key’i disipline etmek önbelleği sakinleştirir, Origin Shield orijini kalabalıktan korur. Boyutlandırmayı makul basamaklarda tutmak, kaliteyi içerik türüne göre sabitlemek, parametreleri temizlemek… Hepsi aynı manzaraya bakıyor: daha az bayt, daha çok isabet.
İşe nereden başlayayım derseniz, önce ölçün. En çok trafik alan üç sayfayı seçin, onların görsel akışını sadeleştirin, format ve kaliteyi minimalliğe çekin. Sonra bir haftalık rapora bakın. Ufak kımıldanmalar sizi cesaretlendirecektir. Vakit buldukça shield ekleyin, anahtarları toparlayın, varyant sayılarını gözden geçirin. Bir bakmışsınız, fatura daha yumuşak, kullanıcı daha neşeli, sistem ise çok daha huzurlu. Umarım bu yazı yolunuzu aydınlatır; bir sonraki buluşmada tecrübelerinizi duymayı çok isterim.
