Ders 13 / 16
Ağ Geçidi Yük Boşaltma
Ortak işlerin kenara taşınmasının mekanik bir kurala bağlanması: bir denetimin okuduğu girdiler yazıldığında taşınabilenlerin ayrılması, tekrarlanan satır sayısının ölçülmesi, güven sınırının kaymasının bedeli ve kenara taşınan denetimin hangi hızda koştuğunun K01 hesabından okunması.
İçindekiler
Toplama ağ geçidinin gövdeye dokunan işiydi. Kenara taşınabilecek işlerin çoğu gövdeye hiç dokunmaz: bir belirtecin imzasının doğrulanması, bir hız sınırının uygulanması, bir erişim kaydının yazılması. Ağ geçidi yük boşaltma (gateway offloading) bu işleri servislerden alıp kenarda tek bir yerde toplamaktır.
İlk ders bu yerleşimi satır sayısıyla karşılaştırdı ama hangi işin taşınabilir olduğunu bir kurala bağlamadı ve “isteğin üstverisine bakan iş kenara ait” ölçütünü sözle bıraktı. Bu ders o ölçütü mekanik hâle getirir: her denetimin okuduğu girdiler yazılır, girdilerin sınıfı denetimi kendiliğinden ayırır. Belirteç doğrulama Kimlik Doğrulama ve Yetkilendirme kursunda, hız sınırlama Web API Tasarımı kursunda, TLS sonlandırma bu kursun Yük Dengeleyici Rolü dersinde ele alındı; hiçbiri burada yeniden anlatılmaz.
Taşınabilirlik Kuralı
Bir denetim iki tür girdi okuyabilir. Üstveri isteğin kendisinden gelir: başlıklar, yol, kaynak adres, içerik uzunluğu. Alan girdisi sistemin verisinden gelir: gönderi kaydı, sözleşme kaydı, günlük sayaç. Kural tek cümledir: bir denetim yalnız üstveri okuyorsa kenara taşınabilir, bir alan girdisi okuyorsa serviste kalır.
Kuralın gerekçesi bir bağ sayısıdır. Alan girdisi okuyan bir denetim kenara taşındığında ağ geçidi o veriye erişmek zorunda kalır; ilk dersin söylediği gibi kenar iki bağlamın alan kurallarını tanımaya başlar ve iki bağlamın her değişikliği kenarı düzenletir. Kural, o bağı kurmayı reddetmenin ölçülebilir biçimidir.
// kenar/denetim.mjs — alti denetim, okuduklari girdiler ve tasinabilirlik kurali export const USTVERI = ["basliklar", "yol", "kaynak adres", "icerik uzunlugu"]; // okur: kararin zorunlu girdileri; secmeli: kayda yazilmasi istenen ama karari degistirmeyen girdi export const DENETIM = { "belirtec imzasi": { okur: ["basliklar"], secmeli: [], satir: 12 }, "hiz siniri": { okur: ["kaynak adres", "basliklar"], secmeli: [], satir: 9 }, "govde boyutu": { okur: ["icerik uzunlugu"], secmeli: [], satir: 5 }, "erisim kaydi": { okur: ["yol", "basliklar"], secmeli: ["gonderi kaydi"], satir: 6 }, "gonderi sahipligi": { okur: ["basliklar", "gonderi kaydi"], secmeli: [], satir: 14 }, "sozlesme kotasi": { okur: ["sozlesme kaydi", "gunluk sayac"], secmeli: [], satir: 11 }, }; export const ustveriMi = (g) => USTVERI.includes(g); export const tasinir = (d) => d.okur.every(ustveriMi); export const eksikAlan = (d) => (tasinir(d) ? d.secmeli.filter((g) => !ustveriMi(g)).length : 0);
Satır sayıları modelin girdisidir ve varsayım sınıfındadır; okunan şey tek bir gerçekleştirme uzunluğu değil, aynı satırların üç serviste tekrarlanmasının ürettiği farktır. Kural ise girdilerin sınıfından çıkar ve satır sayılarından bağımsızdır.
// kenar/bosalt.mjs — kurali alti denetime uygular, satirlari sayar ve K01 hesabina baglar import { DENETIM, tasinir, eksikAlan, ustveriMi } from "./denetim.mjs"; const SERVIS = 3; // takip, olay, ucret const ad = Object.keys(DENETIM); const kenar = ad.filter((a) => tasinir(DENETIM[a])); const serviste = ad.filter((a) => !tasinir(DENETIM[a])); console.log(`${"denetim".padEnd(19)}${"alan girdisi".padStart(13)} karar`); for (const a of ad) { const alan = DENETIM[a].okur.filter((g) => !ustveriMi(g)); console.log(`${a.padEnd(19)}${String(alan.length).padStart(13)} ` + `${tasinir(DENETIM[a]) ? "kenara tasinir" : `serviste kalir (${alan.join(", ")})`}`); } const eksik = kenar.reduce((t, a) => t + eksikAlan(DENETIM[a]), 0); console.log(`\nkenara tasinan = ${kenar.length}/${ad.length}, serviste kalan = ${serviste.length}/${ad.length}`); console.log(`kenarda eksik kalan kayit alani = ${eksik}`); const satir = (liste) => liste.reduce((t, a) => t + DENETIM[a].satir, 0); const YERLESIM = [ ["her serviste", [], ad], ["bosaltilmis", kenar, serviste], ]; console.log(`\n${"yerlesim".padEnd(14)}${"kenar satiri".padStart(14)}${"servis satiri".padStart(15)}${"toplam".padStart(9)}`); for (const [y, k, s] of YERLESIM) { console.log(`${y.padEnd(14)}${String(satir(k)).padStart(14)}` + `${String(SERVIS * satir(s)).padStart(15)}${String(satir(k) + SERVIS * satir(s)).padStart(9)}`); } // K01 Kabaca Buyukluk Hesabi: uctaki tepe 513.89 istek/s (hesap sinifi) const UC_TEPE = 513.89; const GUVEN = [ ["gecit yok", SERVIS, 1, 0], ["gecit dogrular, servis guvenir", 1, 1, SERVIS], ["gecit ve servis dogrular", 1 + SERVIS, 2, 0], ]; console.log(`\n${"belirtec dogrulama".padEnd(32)}${"birim".padStart(7)}${"dogrulama/s".padStart(13)}${"korumasiz servis".padStart(18)}`); for (const [y, birim, kez, acik] of GUVEN) { console.log(`${y.padEnd(32)}${String(birim).padStart(7)}` + `${(UC_TEPE * kez).toFixed(2).padStart(13)}${`${acik}/${SERVIS}`.padStart(18)}`); } // Denetimin hangi hizda kostugu: K01'in uc akis hesabi const HIZ = [ [`kenar denetimleri (${kenar.length})`, "513.89 istek/s", "uctaki tepe"], ["gonderi sahipligi", "416.67 istek/s", "okuma tepesi"], ["sozlesme kotasi", "833.33 kayit/s", "toplu is tarama hizi"], ]; console.log(""); for (const [a, h, k] of HIZ) console.log(`${a.padEnd(23)}${h.padStart(15)} ${k}`);
denetim alan girdisi karar belirtec imzasi 0 kenara tasinir hiz siniri 0 kenara tasinir govde boyutu 0 kenara tasinir erisim kaydi 0 kenara tasinir gonderi sahipligi 1 serviste kalir (gonderi kaydi) sozlesme kotasi 2 serviste kalir (sozlesme kaydi, gunluk sayac) kenara tasinan = 4/6, serviste kalan = 2/6 kenarda eksik kalan kayit alani = 1 yerlesim kenar satiri servis satiri toplam her serviste 0 171 171 bosaltilmis 32 75 107 belirtec dogrulama birim dogrulama/s korumasiz servis gecit yok 3 513.89 0/3 gecit dogrular, servis guvenir 1 513.89 3/3 gecit ve servis dogrular 4 1027.78 0/3 kenar denetimleri (4) 513.89 istek/s uctaki tepe gonderi sahipligi 416.67 istek/s okuma tepesi sozlesme kotasi 833.33 kayit/s toplu is tarama hizi
Kuralın Verdiği Ayrım
Altı denetimin dördü kenara taşınıyor, ikisi serviste kalıyor ve ayrımı yapan şey bir yargı
değil bir liste. gonderi sahipligi bir gönderinin isteği yapan kimliğe ait olup olmadığını
sorar; yanıt için gönderi kaydını okumak zorundadır, dolayısıyla kenarda verilemez. Bu,
Kimlik Doğrulama ve Yetkilendirme kursunda nesne düzeyinde yetki denetimi olarak kurulan
sorunun kenar karşılığıdır: kimliği doğrulamak kenarda yapılabilir, o kimliğin belirli bir
nesneye erişip erişemeyeceğine karar vermek yapılamaz. sozlesme kotasi iki alan girdisi
okuduğu için daha da kesin biçimde serviste kalır.
erisim kaydi satırı kuralın sınırını gösteriyor. Denetim yalnız üstveri okuduğu için kenara
taşınıyor, ama seçmeli girdisi bir alan girdisidir: kenarda yazılan kayıt hangi yolun
çağrıldığını bilir, o çağrının hangi gönderiyi döndürdüğünü bilmez. Sayaç bunu kenarda eksik kalan kayit alani = 1 olarak yazıyor. Boşaltma bu durumda işi taşımaz, işin bir alanını
düşürür; kararın yazılı hâli “erişim kaydı kenara taşındı, kayıt bir alan eksik” olmalıdır.
Satır tablosu kazancı veriyor: altı denetim üç serviste 171 satır tutarken, boşaltılmış yerleşimde kenarda 32 ve servislerde 75 satır, toplam 107 satır tutuyor. Toplam 0,63 katına iniyor. Düşüş üçte bire varmıyor çünkü serviste kalan iki denetim hâlâ üç serviste tekrarlanıyor — ve o iki denetim en uzun ikisidir.
Güven Sınırı Nereye Kayıyor
Boşaltmanın gerçek bedeli satırlarda değil, ikinci tabloda. Geçit yokken üç servis de kendi belirteç doğrulamasını yapar: kod üç birimde, doğrulama saniyede 513,89 kez, korumasız servis 0/3. Doğrulama kenara alınıp servisler ağ geçidine güvendiğinde kod tek birime iner ve doğrulama sayısı değişmez, ama korumasız servis 3/3 olur: ağ geçidini atlayan bir istek üç servisin hiçbirinde doğrulanmaz. Kod satırındaki kazanç, bir güven varsayımıyla ödenmiştir ve o varsayım yazılmadıkça karar eksiktir.
Üçüncü satır varsayımı kaldırıyor: ağ geçidi de servis de doğrularsa korumasız servis 0/3’e döner, ama kod dört birime çıkar ve doğrulama saniyede 1027,78 kez koşar. Aynı işi iki kez yapmanın ölçüsü budur. Üç satırın hiçbiri her ölçüde önde değil; seçim, ağ geçidinin atlanabilir olup olmadığına dair bir kararla birlikte yazılır.
Hesaba Dönüş
Son tablo kursun kuralını iki yönde birden kullanıyor. Kenara taşınan dört denetim K01’in uçtaki tepe hızında koşar: saniyede 513,89 istek, yani sistemin en yüksek istek hızı. Kenarda tek bir yerde toplanan denetimin toplam maliyeti bu yüzden dört denetimin 513,89 ile çarpımıdır ve boşaltma bu çarpımı düşürmez — yalnız tek yerde toplar.
Serviste kalan iki denetim ise farklı hızlarda koşuyor. gonderi sahipligi okuma akışına
aittir ve K01’in tepe okuma hızında, saniyede 416,67 istek üzerinde koşar. sozlesme kotasi
toplu akışa aittir ve K01’in gün sonu tarama hızında, saniyede 833,33 kayıt üzerinde koşar.
Sonuç beklenenin tersidir: kenara taşınmayan bir denetim, kenara taşınanlardan daha yüksek
hızda koşabiliyor. Boşaltma bir başarım kararı değil, bir yerleşim kararıdır; en pahalı iş
kenarda olmak zorunda değildir.
Özet
- Bir denetim yalnız üstveri okuyorsa kenara taşınabilir, bir alan girdisi okuyorsa serviste kalır; kural girdilerin listesinden mekanik olarak çıkar.
- Altı denetimin dördü taşınıyor, ikisi kalıyor:
gonderi sahipligigönderi kaydını,sozlesme kotasisözleşme kaydı ile günlük sayacı okuyor. - Boşaltma işin bir alanını düşürebilir: kenarda yazılan erişim kaydı bir alan eksik kalıyor
(
kenarda eksik kalan kayit alani = 1). - Satır sayısı 171’den 107’ye, 0,63 katına iniyor; düşüşün sınırı serviste kalan iki denetimin hâlâ üç serviste tekrarlanmasıdır.
- Güven sınırı kayıyor: doğrulama kenara alındığında kod 3 birimden 1’e iner ama korumasız servis 0/3’ten 3/3’e çıkar; iki yerde doğrulamak 0/3’e döner, karşılığında kod 4 birime ve doğrulama 513,89’dan 1027,78 kez/s’ye çıkar.
- K01’e dönüş: kenar denetimleri uçtaki tepede (513,89 istek/s) koşarken serviste kalan iki denetim 416,67 istek/s ve 833,33 kayıt/s hızlarında koşuyor — kenar, en pahalı işin yeri değildir.
Sonraki Adım
Buraya kadarki üç ders ağ geçidini tek bir kenar olarak ele aldı: bütün istemciler aynı adrese gelir, aynı denetimlerden geçer ve toplama yapıldığında aynı birleşik gövdeyi alır. Oysa takip bilgisini isteyen istemciler aynı değildir. Bir mobil takip kartı durum ve bölgeyi gösterir, bir web takip sayfası rota adımlarını da açar, bir satıcı paneli ücret kalemlerini ister. Tek bir birleşik gövde üçünü birden karşıladığında her istemci kullanmadığı alanları da taşır. Sonraki ders bu alanları sayar ve kenarı istemci türüne göre bölmenin gövdeyi kaç bayta indirdiğini, karşılığında kaç kenar birimi ekletiğini ölçer.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.