Ders 07 / 19
Strateji Seçimi
Oluşturma modelinin sayfa başına seçilmesi; içerik tazeliği, kişiselleştirme ve ölçek eksenlerinin ölçüye bağlanması, sıralı bir karar kuralı ve tek tip politikalarla karışık politikanın günlük iş ve ihlal sayısı üzerinden karşılaştırılması.
İçindekiler
Altı model ayrı ayrı ölçüldü ve her biri belirli bir durumda üstün çıktı. İstemcide oluşturma sonraki gezinmeleri ağdan kurtardı, sunucuda oluşturma ilk içeriği öne çekti, statik üretim istek anındaki işi sıfırladı, artımlı yeniden üretim tazeliği derleme sıklığından kurtardı, akış ile canlandırma bölme aralıkları daralttı, kenar mesafeyi kesti.
Geriye tek bir soru kalıyor: belirli bir sayfa için hangisi? Bu ders o soruyu bir zevk meselesi olmaktan çıkarıp üç ölçülebilir eksene bağlar.
Üç Eksen
İçerik tazeliği, sayfanın gösterdiği bilginin en fazla ne kadar eski olabileceğidir ve saniye cinsinden yazılır. Bu bir tercih değil, içeriğin doğasından gelen bir gerekliliktir: istasyonun kuruluş bilgisi hiç eskimez, günlük arşiv kapandıktan sonra değişmez, canlı ölçüm listesi bir dakikadan eski olduğunda yanıltıcı hâle gelir.
Tazeliği yazarken iki şey ayrılır: içeriğin değişme sıklığı ve gösterilen değerin kabul edilebilir yaşı. Ölçüm dakikada bir değişebilir ama sayfada ölçüm zamanı yazılıyorsa beş dakikalık bir yaş kabul edilebilir olabilir. Karar, ikincisine göre verilir.
Kişiselleştirme, yanıtın kullanıcıya göre değişip değişmediğidir ve üç değer alır. Yanıt herkese aynıysa kişiselleştirme yoktur. Sayfanın yalnızca küçük bir bölümü kişiye bağlıysa — bir ad, bir yetki rozeti, bir eşik uyarısı — kişiselleştirme bölümseldir. Sayfanın yapısı kullanıcıya göre kuruluyorsa tamdır.
Bu üçlü ayrım önemlidir çünkü bölümsel kişiselleştirme, sayfanın geri kalanının önbelleklenebilirliğini korur. Kenar Oluşturma dersindeki üçüncü ölçüm bunun karşılığıydı: kabuk kenarda hazırken yalnızca küçük parçanın kaynaktan istenmesi süreyi dörtte üçe indirmişti.
Ölçek iki ayrı sayıdır ve karıştırılmamalıdır. Sayfa sayısı derleme maliyetini belirler; istek hacmi çalışma zamanı maliyetini belirler. Statik Site Üretimi dersinde ölçülen doğrusallık birincisiyle, Sunucuda Oluşturma dersindeki istek başına maliyet ikincisiyle ilgilidir. Dört bin arşiv sayfası ve günde sekiz yüz panel isteği, tümüyle farklı iki sınır üretir.
Envanter ve Karar Kuralı
Eksenler yazıldıktan sonra karar bir tablo aramasına döner. Aşağıdaki kural sıralı sınanır; ilk tutan kural kazanır ve sıra rastgele değildir: kişiselleştirme, önbelleklenebilirliği tümüyle kaldırdığı için önce sınanır; ölçek, derleme yolunu kapattığı için ondan sonra gelir; tazelik en sonda pencereyi belirler.
// karar.mjs — istasyon sitesinin sayfa envanteri, model secimi ve politika karsilastirmasi // Girdiler varsayimdir; cikti bu varsayimlarin aritmetigidir, olcum degildir. const GUN = 86400; // saniye const URETIM_MS = 40; // bir sayfayi uretmenin sunucu isi const PARCA_MS = 5; // kenarda birlestirmede kaynaktan istenen kucuk parca const SAYFA_ESIGI = 2000; // bunun ustunde tumunu her derlemede uretmek pahali // tazelik: icerigin en fazla ne kadar eski sunulabilecegi (saniye), Infinity = degismez // kisisel: "yok" | "bolumsel" | "tam" const ENVANTER = [ { yol: "/", tazelik: GUN, kisisel: "yok", sayfa: 1, istek: 4000 }, { yol: "/olcumler", tazelik: 60, kisisel: "yok", sayfa: 1, istek: 30000 }, { yol: "/olcumler/:gun", tazelik: Infinity, kisisel: "yok", sayfa: 4000, istek: 12000 }, { yol: "/panel", tazelik: 5, kisisel: "tam", sayfa: 1, istek: 800 }, { yol: "/harita", tazelik: 7 * GUN, kisisel: "yok", sayfa: 1, istek: 2500 }, { yol: "/hakkinda", tazelik: Infinity, kisisel: "yok", sayfa: 3, istek: 900 }, { yol: "/uyari", tazelik: 60, kisisel: "bolumsel", sayfa: 1, istek: 5000 }, ]; // Karar kurali: sirali sinanir, ilk tutan kural kazanir. function model(s) { if (s.kisisel === "tam") return "sunucuda olusturma"; if (s.kisisel === "bolumsel") return "kenarda birlestirme"; if (s.sayfa > SAYFA_ESIGI) return "artimli yeniden uretim"; if (s.tazelik === Infinity) return "statik site uretimi"; if (s.tazelik >= 3600) return "statik site uretimi"; if (s.tazelik >= 30) return "artimli yeniden uretim"; return "sunucuda olusturma"; } // Gunluk sunucu isi (saniye). Artimli uretimde ilk iska bir kez odendigi icin // kararli duruma bakilir; degismez icerik yeniden uretilmez. function gunlukIs(s, secim) { switch (secim) { case "statik site uretimi": return (s.sayfa * URETIM_MS) / 1000; // gunde bir derleme case "sunucuda olusturma": return (s.istek * URETIM_MS) / 1000; case "kenarda birlestirme": return (s.istek * PARCA_MS) / 1000; case "artimli yeniden uretim": { if (s.tazelik === Infinity) return 0; const uretim = Math.min(s.istek, s.sayfa * (GUN / s.tazelik)); return (uretim * URETIM_MS) / 1000; } default: return 0; } } console.log("yol".padEnd(16) + "tazelik".padStart(10) + "kisisel".padStart(11) + "sayfa".padStart(7) + "istek".padStart(8) + " secilen model"); for (const s of ENVANTER) { const t = s.tazelik === Infinity ? "degismez" : `${s.tazelik} s`; console.log(s.yol.padEnd(16) + t.padStart(10) + s.kisisel.padStart(11) + String(s.sayfa).padStart(7) + String(s.istek).padStart(8) + " " + model(s)); } // Politikalar: uc tek tip secim ve karar kuralinin urettigi karisik secim. const POLITIKALAR = [ ["hepsi sunucuda", () => "sunucuda olusturma"], ["hepsi statik", () => "statik site uretimi"], ["hepsi artimli", () => "artimli yeniden uretim"], ["karar kurali", model], ]; console.log("\npolitika".padEnd(18) + "gunluk is (s)".padStart(15) + "tazelik ihlali".padStart(16) + "kisisellestirme ihlali".padStart(24)); for (const [ad, sec] of POLITIKALAR) { let is = 0, tazelikIhlali = 0, kisiselIhlali = 0; for (const s of ENVANTER) { const secim = sec(s); is += gunlukIs(s, secim); // Statik uretim gunde bir derlenir: bir gunden kisa tazelik istegini karsilamaz. if (secim === "statik site uretimi" && s.tazelik < GUN) tazelikIhlali += 1; // Kisiye ozel bolum, herkese ayni yaniti veren modellerde uretilemez. if (s.kisisel !== "yok" && (secim === "statik site uretimi" || secim === "artimli yeniden uretim")) { kisiselIhlali += 1; } } console.log(ad.padEnd(18) + is.toFixed(1).padStart(15) + String(tazelikIhlali).padStart(16) + String(kisiselIhlali).padStart(24)); }
yol tazelik kisisel sayfa istek secilen model / 86400 s yok 1 4000 statik site uretimi /olcumler 60 s yok 1 30000 artimli yeniden uretim /olcumler/:gun degismez yok 4000 12000 artimli yeniden uretim /panel 5 s tam 1 800 sunucuda olusturma /harita 604800 s yok 1 2500 statik site uretimi /hakkinda degismez yok 3 900 statik site uretimi /uyari 60 s bolumsel 1 5000 kenarda birlestirme politika gunluk is (s) tazelik ihlali kisisellestirme ihlali hepsi sunucuda 2208.0 0 0 hepsi statik 160.3 3 2 hepsi artimli 147.2 0 2 karar kurali 114.8 0 0
Üst tablonun üçüncü satırı kuralın sırasını haklı çıkarır: arşiv sayfaları hiç değişmez ve saf mantıkla statik üretime aittir, ama dört bin sayfa eşiğin üstündedir. Kural bu yüzden onları artımlı yeniden üretime yollar — sayfalar ilk istendiklerinde üretilir, sonra değişmedikleri için bir daha üretilmezler. Günlük iş hesabında bu satırın katkısı sıfırdır.
Yedinci satır bölümsel kişiselleştirmenin karşılığıdır. Uyarı sayfasının gövdesi herkese aynıdır, yalnızca eşik uyarısı kişiye bağlıdır. Sayfanın tamamı sunucuda üretilseydi istek başına 40 milisaniye ödenecekti; kenarda birleştirmeyle 5 milisaniyeye iner.
Politikaların Karşılaştırılması
Alt tablo, tek tip bir politikanın neden yetmediğini üç sütunda gösterir.
Hepsi sunucuda hiçbir kısıtı ihlal etmez ve en pahalıdır: günde 2208 saniye sunucu işi, karar kuralının yaklaşık on dokuz katı. Bütün sayfaları en kısıtlayıcı sayfanın kuralına tabi tutmanın bedeli budur.
Hepsi statik ucuza gelir ama üç sayfa türünün tazelik gereksinimini ve iki sayfa türünün kişiselleştirmesini karşılayamaz. Bu sütunlar para birimiyle ölçülmez; karşılanmayan bir gereksinim, ucuzluğun telafi edemeyeceği bir kusurdur.
Hepsi artımlı tazelik ihlalini kapatır — pencere içeriğin gereksinimine ayarlanabilir — ama kişiselleştirmeyi çözemez, çünkü paylaşılan bir kopya kişiye özel olamaz.
Karar kuralı hem ihlalsizdir hem de en ucuzdur. Bu bir rastlantı değildir: her sayfa kendi kısıtlarının izin verdiği en ucuz modeli aldığı için toplam da en düşük çıkar. Karışık politikanın maliyeti, tek tip politikalarınkinin ortalaması değil, alt sınırıdır.
Eksenlerin Yakalamadığı Ölçütler
Üç eksen kararın çoğunu verir; hepsini vermez. Dört ölçüt daha vardır ve bunlar seçimi değiştirebilir.
İşaretlemenin makine tarafından okunması. İçeriğin betik çalıştırmayan istemcilerce okunması gerekiyorsa istemcide oluşturma elenir. İlk derste ölçülen sıfır, bu kısıtın somut hâliydi.
İlk ziyaret oranı. Ziyaretçilerin çoğu tek sayfa görüp ayrılıyorsa istemcide oluşturmanın sonraki gezinmelerde kazandırdığı hız hiç kullanılmaz; ilk yükleme bedeli sürekli ödenir. Aynı arayüz, günde saatlerce açık kalan bir panel olduğunda tersine döner.
Hata dayanıklılığı. Veri kaynağı yanıt vermediğinde ne olacağı modele göre değişir: statik çıktı sunulmaya devam eder, artımlı üretim eski kopyayı verir, sunucuda oluşturma belgeyi hiç üretemez. Kesinti sırasında görünmesi gereken sayfalar bu ölçüte göre seçilir.
İşletme karmaşıklığı. Beş ayrı modelin bir arada bulunduğu bir sitede, her modelin ayrı bir dağıtım yolu, ayrı bir önbellek davranışı ve ayrı bir hata biçimi vardır. Karar kuralının kazandırdığı sunucu saatleri, sınama ve tanı yükündeki artışla birlikte değerlendirilir. Az sayıda modelle çalışmak da bir seçimdir.
Karar Yeniden Gözden Geçirilir
Envanterdeki değerler sabit değildir. Arşiv sayfa sayısı her gün bir artar ve eşiği geçtiğinde seçim değişir. Bir sayfaya kişiye özel bir bölüm eklendiğinde kişiselleştirme sütunu “yok”tan “bölümsel”e döner ve model değişir. İstek hacmi on kat arttığında sunucuda oluşturmanın maliyeti aynı oranda büyür.
Bu yüzden karar kuralı koda gömülü bir tablo olarak tutulur ve envanterin değerleri ölçümden beslenir: sayfa sayısı derleme çıktısından, istek hacmi erişim kayıtlarından, tazelik gereksinimi içeriğin sahibinden. Tahminle doldurulmuş bir envanter, yanlış bir kuralın doğru sonucunu verir.
Özet
- Oluşturma modeli site geneline değil sayfa türüne göre seçilir; kararın üç ölçülebilir ekseni içerik tazeliği, kişiselleştirme derecesi ve ölçektir.
- Ölçek iki ayrı sayıdır: sayfa sayısı derleme maliyetini, istek hacmi çalışma zamanı maliyetini belirler.
- Sıralı bir karar kuralı — önce kişiselleştirme, sonra ölçek, en sonda tazelik — envanteri modellere eşler ve seçimi yeniden üretilebilir kılar.
- Karışık politika, ölçülen envanterde hem kısıt ihlalsizdir hem de tek tip politikaların en ucuzundan daha ucuzdur; her sayfa kendi kısıtlarının izin verdiği en ucuz modeli alır.
- Üç eksen dışında dört ölçüt daha karara girer: işaretlemenin makine tarafından okunması, ilk ziyaret oranı, veri kaynağı kesildiğinde beklenen davranış ve işletme karmaşıklığı.
Sonraki Adım
Strateji seçildi: her sayfa türü hangi modelle üretileceğini biliyor. Ama modellerin hepsi aynı şeyi varsayıyor — çalıştırılabilir bir çıktının hazır olduğunu. Statik üretim bir derleyicinin çalışmasını, sunucuda oluşturma sunucuya yüklenecek bir paketi, kenarda birleştirme kenara gönderilecek küçük bir modülü, canlandırma ise istemciye inecek bileşen kodunu gerektirir. Bu çıktıları üreten şey, kaynak dosyalar arasındaki bağımlılık ilişkisini çözüp hangi kodun hangi parçaya gireceğine karar veren bir süreçtir. Sonraki konu bununla açılır: Modül Paketleme dersi, bağımlılık çizgesinin nasıl kurulduğunu ve bu çizgeden kaç parçanın hangi ölçütle üretildiğini ele alır.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.